我的CMake项目编译一个与大型静态库链接的Python .so/.dylib扩展模块。我想用符号的隐藏可见性编译子项目的静态库:它将允许链接器(或LTO优化器)丢弃未被我的python模块使用的符号。子项目的CMake覆盖策略
最好的办法是使用CXX_VISIBILITY_PRESET
和朋友对子项目的静态库目标。 然而,从3.1.0通过声明子项目使用政策:
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,但目前我没有看到其他方式。
有什么想法?
代替使用属性,则可以简单地调整连接标志[CMAKE_STATIC_LINKER_FLAGS](HTTPS:/ /cmake.org/cmake/help/v3.7/variable/CMAKE_STATIC_LINKER_FLAGS.html)。 – Tsyvarev
这是一个编译时间选项。理想情况下,我会将CXX_VISIBILITY_PRESET设置为全局“隐藏”,然后设置'set_target_properties(python_module PROPERTIES CXX_VISIBILITY_PRESET default)'。实际上,它在声明私有符号的源的编译器标志上设置'-fvisibility = hidden'。 – Piezoid
如果您确定该子项目可以使用“CMP0063”策略,那么您可以替换子项目的“cmake_minimum_required”函数,以便启用给定的策略。参见[那个答案](http://stackoverflow.com/a/35345933/3440745)关于CMake函数的替换。 – Tsyvarev