我的CMake项目编译一个Python .so/.dylib扩展模块,该模块链接了一个大型静态库。我希望为子项目的静态库编译使用隐藏的符号可见性:这将使链接器(或LTO优化器)丢弃由我的Python模块未使用的符号。
最好的方法是在子项目的静态库目标上使用 CXX_VISIBILITY_PRESET
和相关设置。
然而,子项目使用 3.1.0 版本的策略来声明:
cmake_minimum_required (VERSION 3.1.0)
策略 CMP0063 NEW: 为所有目标类型保留可见性属性。
只在版本3.3及以上引入,因此 set_target_properties 没有效果。
我的项目需要CMake 3.3,但我无法控制子项目。
我想避免对子项目的 CMakeLists.txt 进行打补丁,但目前我没有其他方法。
有任何想法吗?
set_target_properties(python_module PROPERTIES CXX_VISIBILITY_PRESET default)
。有效地为声明私有符号的源设置了'-fvisibility=hidden'编译器标志。 - PiezoidCMP0063
策略,那么你可以替换子项目中的cmake_minimum_required
函数,这样它就会启用给定的策略。参考这个答案了解CMake函数的替换方法。 - Tsyvarev