我的CMake项目编译了一个与大型静态库链接的Python .so / .dylib扩展模块。我想编译具有隐藏的符号可见性的子项目的静态库:它将允许链接器(或LTO优化器)丢弃我的python模块未使用的符号。
执行此操作的最佳方法是在子项目的静态库目标上使用CXX_VISIBILITY_PRESET
和朋友。
但是,子项目通过声明:
cmake_minimum_required (VERSION 3.1.0)
策略CMP0063 NEW: Honor visibility properties for all target
types.
仅从版本3.3引入,因此set_target_properties没有效果。
我的项目需要CMake 3.3,但我无法控制子项目。
我想避免修补子项目CMakeLists.txt,但目前我没有别的办法。
有什么想法吗?
答案 0 :(得分:2)
cmake_minimum_required()
对CMake政策有以下影响:
- 指定版本或更早版本中引入的所有策略都将设置为使用NEW行为。
- 将取消设置指定版本之后引入的所有策略。
但是你可以使用CMake的CMAKE_POLICY_DEFAULT_CMP<NNNN>
全局变量&#34;默认为CMake Policy CMP,否则它将被取消设置。&#34;
以下是一个例子:
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
add_subdirectory(MySubProjDir)
<强>参考强>
答案 1 :(得分:0)
您可以使用add_compile_option
指定适当的编译器选项。