C/C++中控制动态库的符号可见性

本文介绍了如何通过GNU的visibility属性解决动态库与客户端之间因使用相同第三方库而产生的符号冲突问题,并提供了具体的CMake配置及代码示例。

一、需求

写了一个动态库供客户使用,此库使用了一些第三方静态库,无奈客户也使用了这些第三方库,从而产生了符号冲突。
所以需要隐藏此库中第三方库的导出符号。

二、可选解决方案

最终选择方案三,即利用gnu的visibility 属性。
(1)修改CMakeList.txt,添加如下属性,从而使所有符号默认不导出。

set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_C_VISIBILITY_PRESET hidden)

(2)设置visibility属性,导出so的关键符号

void __attribute__ ((visibility ("default"))) fun();

三、参考

1.https://stackoverflow.com/questions/17080869/what-is-the-cmake-equivalent-to-gcc-fvisibility-hidden-when-controlling-the-e
2.https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
3.https://www.ibm.com/developerworks/cn/aix/library/au-aix-symbol-visibility/
4.https://holtstrom.com/michael/blog/post/437/Shared-Library-Symbol-Conflicts.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello2mao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值