2013-07-17 80 views
3

我有以下庫lib_A,lib_B,lib_C,lib_D。我在做類似的東西在我的cmake文件(順序很重要):cmake庫鏈接順序

  1. ADD_LIBRARY(lib_A)
  2. ADD_LIBRARY(lib_B)
  3. ADD_LIBRARY(lib_C)
  4. ADD_LIBRARY(lib_D)
  5. TARGET_LINK_LIBRARIES(lib_B lib_C)
  6. TARGET_LINK_LIBRARIES(lib_A lib_B)
  7. ADD_EXECUTABLE(EXEC)
  8. TARGET_LINK_LIBRARIES(EXEC lib_A)
  9. TARGET_LINK_LIBRARIES(EXEC lib_D)

這導致下面的鏈接器命令。

連接-llib_A -llib_D -llib_B -llib_C

Q1。爲什麼lib_B和lib_C在lib_D之後? Q2302。當我改變CMake的一點點,做這樣的事情:

8_1 TARGET_LINK_LIBRARIES(lib_A lib_D) 9_ TARGET_LINK_LIBRARIES(EXEC lib_A)

那麼連接順序是這樣的 連接-llib_A -llib_B -llib_C -llib_D 這裏,lib_B和lib_C在lib_D之前。這意味着target_link_libraries對可執行目標和庫目標的工作方式不同。我對嗎?

這裏的問題是,lib_B和lib_C也依賴於lib_D,但我不想製作target_link_libraries(lib_B lib_D)和target_link_libraries(lib_C lib_D),因爲我有更多這種情況,我必須這樣做手動爲每個庫。 當然,像第二季度一樣解決問題,但是 第三季度是否這個順序通過cmake以某種方式保證,或者它只是一個偶然?

謝謝

+0

不知道的遭受疼痛ex和lib之間的順序不同,但如果B和C都依賴於D,則應該真正指定它。 – Fraser

+0

問題是B和C在邏輯上是平臺獨立A的一部分,而整體依賴於平臺lib D.我知道我應該這樣做,但我有很多這樣做,並且手動完成它將做出很多努力來維護它並提供一些自動解決方案會增加基於cmake的構建系統的複雜性。另一個問題是,當我將這個D依賴項明確地設置爲每個平臺獨立的lib時,將導致D將被列在鏈接器列表上很多次。 – user2301299

+0

我有與外部庫相同的問題 - 例如提升。我想避免在每個庫中設置依賴關係。 – user2301299

回答

0

只是鏈接lib_B和lib_C到LIBD,這是值得的(我可以告訴的經驗),否則就會有大麻煩,例如,如果您嘗試安裝程序。在鏈接到任何其他庫之前,lib_C和lib_D應該在完成創建庫文件時解決所有符號。

順便說一句,你可以壓縮你的每個目標target_link_libraries在一個線,如:

TARGET_LINK_LIBRARIES(exec lib_A lib_D) 

而且,如果執行不會對lib_D直接依賴,你能避免鏈接,如果你有正確鏈接lib_A到lib_D。

無論如何,對於Q1:即使訂單是由CMake的保證,不保證該方式你的連接將對待它,你會如果你依賴於

+0

謝謝你的答案。我決定自動將依賴關係添加到每個庫中。它將解決另一個問題。其中一些庫在許多可執行文件之間共享。保持每個庫級別的依賴關係,在連接這些可執行文件時,我不必擔心未解決的符號。 – user2301299