管理 so 动态库导出符号
2024-11-28 21:15:27
在 Windows 下开发 DLL,必须明确指定要导出哪些函数,MSVC 编译器通过 /def 链接选项来指定一个符号表。
到了 GCC 这里,所有符号竟然是默认导出的,不处理的话会将程序内所有类、函数等一并导出,完全是没有必要的,增加文件尺寸不说还暴露了程序内部的信息。
解决方案是通过-Wl,--version-script=exports.txt
编译选项来指定一个符号文件,其中exports.txt
文件内容格式如下:
1 | { |
这样就可以导出foo1
、foo2
和所有以my
开头的函数了。
CMake 中可以这样设置:
1 | target_compile_options(target PRIVATE "-Wl,--version-script=exports.txt") |
当然这个文件的功能远不止如此,另一个核心功能是符号版本控制,这个就与本文无关了。
相关阅读
VERSION Command
GCC 怎么控制 .so/.dll 中导出的符号?这个方法比 –fvisibility 更好用!
GCC编译之如何控制共享文件导出符号