动态库的符号可见性 | C & C++
在编译动态库时,可以通过 gcc 的 flag -fvisibility=[default|internal|hidden|protected]
参数修改动态库中符号的可见性,其中 default 表示符号可见,hidden 表示符号不可见,internal 和 protected 一般比较少用,这里不展开。cmake 对应的命令是 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
。
如果想要某些符号可见,可以使用如下方式修饰函数声明:
1 | void __attribute__ ((visibility ("default"))) visible_fun(); |
共享库设置部分符号不可见有如下好处:
- 提升动态共享对象 DSO (Dynamic Shared Object) 的加载效率
- 减少 DSO 的大小
- 避免符号冲突
动态库的符号可见性 | C & C++