gcc - 控制共享库的导出符号时,CMake 相当于 "gcc -fvisibility=hidden"的是什么?

标签 gcc cmake visibility

我用 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/

相关文章:

c++ - 如何使用 Cmake 在 Linux 上设置 MKL

java - 是否有增强 Java 访问控制的 Maven 插件?

javascript - 使用 bool 值隐藏/显示元素

C++设置浮点异常环境

gcc - MinGW 4.8.1 C++11 线程支持

linux - 如何在 Synology Diskstation DS713+ 上安装 node.js

c++ - GMP、MPC、MPFR的库文件和头文件是分开的,如何安装GCC?

mysql - 无法链接到 C++ 中已编译/.so 源库

macos - cmake 不断添加 std=gnu++11 选项

php - 为什么在 PHP 中将 public 放在静态函数之前?