我用 C++ 开发了跨平台软件。据我所知,Linux .so默认导出所有符号,通过 "gcc -fvisibility=hidden"
我可以将所有导出的符号设置为隐藏,然后设置 __attribute__(visibility("default"))
用于我想要导出的类和函数,这样我就可以控制我想要导出的内容。
我的问题是,使用CMake,我该如何做“gcc -fvisibility=hidden”控制的工作?
最佳答案
您应该使用当前的 CMake 版本和 <LANG>_VISIBILITY_PRESET,而不是直接设置编译器标志。属性代替。这样您就可以避免 CMakeList 中的编译器细节并提高跨平台适用性(避免诸如支持 GCC 而不是 Clang 之类的错误)。
即,如果您使用 C++,您可以调用
set(CMAKE_CXX_VISIBILITY_PRESEThidden)
以全局设置属性,或 set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESEThidden)
将设置限制为特定库或可执行目标。如果您使用 C,只需在上述命令中将 CXX 替换为 C。您可能还想调查VISIBLITY_INLINES_HIDDEN还有属性(property)。
GENERATE_EXPORT_HEADER 的文档包括一些与这两个属性相关的更多提示和示例。
关于gcc - 控制共享库的导出符号时,CMake 相当于 "gcc -fvisibility=hidden"的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080869/