我的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