2017-03-21 78 views
0

我的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,但目前我没有看到其他方式。

有什么想法?

+0

代替使用属性,则可以简单地调整连接标志[CMAKE_STATIC_LINKER_FLAGS](HTTPS:/ /cmake.org/cmake/help/v3.7/variable/CMAKE_STATIC_LINKER_FLAGS.html)。 – Tsyvarev

+0

这是一个编译时间选项。理想情况下,我会将CXX_VISIBILITY_PRESET设置为全局“隐藏”,然后设置'set_target_properties(python_module PROPERTIES CXX_VISIBILITY_PRESET default)'。实际上,它在声明私有符号的源的编译器标志上设置'-fvisibility = hidden'。 – Piezoid

+0

如果您确定该子项目可以使用“CMP0063”策略,那么您可以替换子项目的“cmake_minimum_required”函数,以便启用给定的策略。参见[那个答案](http://stackoverflow.com/a/35345933/3440745)关于CMake函数的替换。 – Tsyvarev

回答

1

cmake_minimum_required()对CMake的政策产生以下影响:

  • 在指定的版本中引入的所有政策或更早将被设置为使用新的行为。
  • 指定版本后引入的所有策略都将被取消设置。

但是你可以使用的CMake的CMAKE_POLICY_DEFAULT_CMP<NNNN>全局变量为“默认CMake的政策CMP当它否则未设置。”

下面是一个例子:

set(CMAKE_POLICY_DEFAULT_CMP0063 NEW) 
add_subdirectory(MySubProjDir) 

参考

0

您可以使用add_compile_option指定适当的编译器选项。

+0

目前,我在除python模块外的所有目标上都使用'target_compile_options($ {TARGET_NAME} PRIVATE -fvisibility = hidden)'。 由于标题表明我更感兴趣的是从顶级项目的cmake_minimum版本中利用CMake功能(CMake语言中的策略)的一般方法,需要较低版本的子项目中。 – Piezoid