在控制共享库的导出符号时,CMake等效于“gcc -fvisibility = hidden”是什么?

时间:2013-06-13 06:48:54

标签: gcc cmake visibility

我用c ++开发了跨平台软件。据我所知,Linux .so默认导出所有符号,通过"gcc -fvisibility=hidden"我可以将所有导出的符号设置为隐藏,然后为我要导出的类和函数设置__attribute__(visibility("default")),所以我可以控制我想要导出的内容。

我的问题是,使用CMake,我怎样才能将这项工作作为“gcc -fvisibility = hidden”控制?

2 个答案:

答案 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)