2016-05-30 36 views
1

我有一個示範項目,它是structure就像如下:如何處理的CMake GCC鏈接選項(如全存檔,--allow-多定義)

top_dir 
    CMakeLists.txt 
    sub_dir1 
     CMakeLists.txt 
    sub_dir2 
     CMakeLists.txt 

top_dir/sub_dir1/CMakeLists.txt用於構建lib1通過使用add_library(lib1 ...), top_dir/sub_dir2/CMakeLists.txt用於構建exe1並鏈接lib1target_link_library(exe1 lib1)

而且top_dir的內容/的CMakeLists.txt是如下:

add_subdirectory(sub_dir2) 
add_subdirectory(sub_dir1) 

通常,當構建目標exe1,cmake的將檢查dependency所以lib1將建設exe1年前建成。問題是我正在將一個已存在的makefile項目轉移到CMake中,並且有很多gcc link options,如"whole-archive ... no-whole-archive, allow-mutiple-definition",如果使用像target_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a --no-whole-archive")(這樣的形式,這可能不起作用,它只是一個例如),cmake似乎不構建lib1以上。有什麼辦法我可以使用target_link_librarytarget_link_library(exe1 "-Wl, --whole-archive ../sub_dir1/liblib1.a")和cmake鏈接依賴項檢查仍然工作,或者其他方式我可以將這些gcc鏈接選項轉換爲cmake?

+0

選項'--whole-archive'是*開關*,它不需要與進一步的庫文件和'--no-whole-archive'選項組合成*單參數*。這樣一來,庫文件就是鏈接器的一個單獨的參數,當你使用**庫目標**時,它會自動生成:'target_link_libraries(exe1「-Wl,-whole-archive」lib1「-Wl, -no-全檔案「)'。 (行情僅用於清醒,他們可以安全地省略)。 – Tsyvarev

+0

@Tsyvarev,我的意思是'target_link_libraries(exe1「-Wl,-whole-archive」lib1,lib2,lib3 ...「-Wl,-no-whole-archive」)'',而不僅僅是一個lib。 –

+0

因此,在普通選項之間枚舉所有lib **目標**:'target_link_libraries(exe1「-Wl,-whole-archive」lib1 lib2 lib3「-Wl,-no-whole-archive」)''。 – Tsyvarev

回答

2

target_link_libraries的參數將按照出現的順序進入結果命令行。每當目標名稱被用作參數時,目標的輸出路徑用於結果命令行中。所以,當你需要路徑,該庫在命令行中您可以使用圖書館的目標:

target_link_libraries(exe1 -Wl,--whole-archive lib1 -Wl,--no-whole-archive) 

這樣的方式執行EXE1和圖書館lib1內之間的目標水平相關性由CMake的自動推導,照常。