我用 C++ 开发了跨平台软件。据我所知,Linux.so默认导出所有符号,通过"gcc -fvisibility=hidden"
我可以将所有导出的符号设置为隐藏,然后设置__attribute__(visibility("default"))
我要导出的类和函数,这样我就可以控制我要导出的内容。
我的问题是,使用 CMake,我怎样才能将工作作为“gcc -fvisibility=hidden”控制?
我用 C++ 开发了跨平台软件。据我所知,Linux.so默认导出所有符号,通过"gcc -fvisibility=hidden"
我可以将所有导出的符号设置为隐藏,然后设置__attribute__(visibility("default"))
我要导出的类和函数,这样我就可以控制我要导出的内容。
我的问题是,使用 CMake,我怎样才能将工作作为“gcc -fvisibility=hidden”控制?
您应该使用当前的 CMake 版本和<LANG>_VISIBILITY_PRESET属性,而不是直接设置编译器标志。这样,您可以避免 CMakeLists 中的编译器细节并提高跨平台适用性(避免诸如支持 GCC 而不是 Clang 之类的错误)。
即,如果您使用 C++,您可以调用
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
全局设置属性,或者set_target_properties(MyTarget PROPERTIES CXX_VISIBILITY_PRESET hidden)
将设置限制为特定库或可执行目标。如果您使用 C,只需在上述命令中将 CXX 替换为 C。您可能还想调查VISIBLITY_INLINES_HIDDEN属性。
GENERATE_EXPORT_HEADER的文档包括与这两个属性相关的更多提示和示例。
您可以像这样向 Cmake 编译器添加一个标志:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
为了确保这仅在 Linux 下完成,您可以使用以下代码:
if(UNIX AND CMAKE_COMPILER_IS_GNUCC)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
endif()