2017-03-21 154 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