56

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

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

4

2 回答 2

93

您应该使用当前的 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的文档包括与这两个属性相关的更多提示和示例。

于 2015-07-01T09:17:03.077 回答
6

您可以像这样向 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()
于 2013-06-13T08:21:51.650 回答