2012-01-30 111 views
2

我使用CMAKE來構建一個由許多庫和可執行文件組成的相當大的項目。我如何指定庫庫依賴關係存在問題,並且事情不能按需要完全工作。示意圖我的項目如下所示:CMAKE - 解決項目中圖書館之間的依賴關係

CMakeLists.txt 
lib1/src/CMakeLists.txt 
lib2/src/CMakeLists.txt 
app/src/CMakeLists.txt 

I.e.我有兩個庫lib1和lib2,其中lib2依賴於lib1,應用程序依賴於lib1和lib2。我建庫使用共享和靜態鏈接:

add_library(lib1_static STATIC lib1_src) 
add_library(lib1_shared SHARED lib1_src) 
set_target_properties(lib1_static PROPERTIES OUTPUT_NAME lib1) 
set_target_properties(lib1_shared PROPERTIES OUTPUT_NAME lib2) 

爲了確保dependies滿意我有target_link_libraries()爲:

#lib2/src/CMakeLists.txt: 
target_link_libraries(lib2_shared lib1_shared) 
target_link_libraries(lib2_static lib1_static) 

而對於應用程序:

#app/src/CMakeLists.txt 
target_link_libraries(app_static lib2_static) # <- No explicit dependance on lib1 
target_link_libraries(app_shared lib2_shared) 

現在 - 問題是,當我重新編譯時,它編譯了相當長的時間,但是在創建liblib2.so文件時,錯誤消息:

make[2]: *** No rule to make target 'lib1/src/liblib1.so' needed by 'lib2/src/liblib2.so'. Stop. 

出現。如果我只是發出一個新的make命令 - 事情將會成功。所以看來我沒有設法正確配置依賴關係?需要注意的是,從第一內建嘗試輸出廠名顯示:

Linking C shared library liblib1.so 

所以構建本身suceeded - 但它似乎是一個版本將無法使用此建實例期間創建的liblib1.s0文件來解決LIB2依賴?

我試過了 - 再次移除 - 幾個varietes的link_directories()和target_depends()沒有成功。

感謝您的任何提示?

喬金 -

回答

0

看來,得到的CMake通過

set_target_properties(lib1_static PROPERTIES OUTPUT_NAME lib1) 

使用混淆試試這個:

target_link_libraries(lib2_shared lib1) 

或刪除這些屬性設置。

+0

好的 - 謝謝你的回答;正如前面提到的,我通過升級CMake來解決它。但我確實感覺到我的CMakeLists.txt中的整個靜態/共享處理非常複雜 - 所以也許我可以按照你的建議來簡化它。 – user422005 2012-02-07 07:51:06

0

我正在使用CMake版本2.6 - 我升級到CMake 2.8,然後它爲我工作。