动态库链接静态库防止符号污染

本文探讨了在C++开发中,动态库链接静态库时可能出现的符号污染问题,并提出了解决方案。通过在链接时添加-Wl,--exclude-libs,ALL选项,可以避免静态库的符号被包含在动态库中,从而保持动态库的清洁。" 113186163,10569231,链表操作详解:创建、查找、插入与删除,"['数据结构', '链表操作', '内存管理']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常遇到如此情况,动态库A依赖静态库B,在制作动态库A时,链接静态库B,动态库A中会新增静态库B的符号,从而污染动态库A。

如何规避这种情况呢? 

答案时在link时添加选项

-Wl,--exclude-libs,ALL

是将所有的静态库的符号隐藏。

例子

1. 先制作一个静态库 libffunc.a

头文件 ffunc.h

//  ffunc.h
#pragma once

#define DLL_PUBLIC __attribute__ ((visibility ("default")))
#define DLL_LOCAL  __attribute__ ((visibility ("hidden")))

DLL_PUBLIC int ftest1();
DLL_LOCAL int ftest2();
 int ftest3();

cpp ffunc.cpp

// ffunc.cpp
#include "ffunc.h"


int ftest1() {
    return 11;
}
int ftest2() {
    return 12;
}
int ftest3() {
    return 13;
}
// 制作静态库
g++ -c -o ffunc.o -static  -fPIC -fvisibility=hidden ./ffunc.cpp

ar rcs libffunc.a ffunc.o

查看静态库libffunc.a的符号

$ readelf -s ./libffunc.a

File: ./libffunc.a(ffunc.o)

Symbol table '.sym
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值