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