我的 CMake 项目编译了一个与大型静态库链接的 Python .so/.dylib 扩展模块。我想编译子项目的静态库,隐藏符号的可见性:它允许链接器(或 LTO 优化器)丢弃我的 python 模块未使用的符号。
最好的方法是在子项目的静态库目标上使用 CXX_VISIBILITY_PRESET
和 friend 。
但是,子项目通过声明使用 3.1.0 中的策略:
cmake_minimum_required (VERSION 3.1.0)
政策 CMP0063 新:所有目标的荣誉可见性属性
类型。
仅从 3.3 版引入,因此 set_target_properties 没有任何效果。
我的项目需要 CMake 3.3,但我无法控制子项目。
我想避免修补子项目 CMakeLists.txt,但目前我看不到其他方法。
有什么想法吗?
最佳答案
cmake_minimum_required()
对 CMake 策略有以下影响:
- All policies introduced in the specified version or earlier will be set to use NEW behavior.
- All policies introduced after the specified version will be unset.
但您可以使用 CMake 的 CMAKE_POLICY_DEFAULT_CMP<NNNN>
全局变量设置为“默认为 CMake Policy CMP,否则未设置。”
这是一个例子:
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
add_subdirectory(MySubProjDir)
引用
关于python - 子项目的 CMake 覆盖策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42922905/