2014-07-14 150 views
2

我有:CMake的項目共享依賴

  • 共享庫X,它是獨立
  • 共享庫Y,使用X
  • 可執行Z,其使用X和Y

它們都有自己的CMakeLists.txt,可以獨立配置和構建。

但是,我無法使可執行文件(Z)的CMakeLists.txt正常工作。

我的做法是這樣的:

foreach(clib ${OWN_LIBS}) 
    set(LIBS "${LIBS} ${clib}") 
    set(CLIB_DIR "${PROJECT_SOURCE_DIR}/../lib${clib}") 
    set(CLIB_BUILD_DIR "${CLIB_DIR}/build") 

    add_subdirectory("${CLIB_DIR}" "${CLIB_BUILD_DIR}") 
    include_directories("${CLIB_DIR}/incl") 
    link_directories("${CLIB_BUILD_DIR}") 
endforeach(clib) 

隨着OWN_LIBS是項目Ÿ只是 「X」,並在項目Z.是 「XY」

這適用於工程Y,但在項目Z,我得到:

CMake的錯誤在...(add_subdirectory):二進制目錄

.../libX/build 

已用於構建源目錄。它不能被用來 編譯源代碼目錄

.../libX 

指定一個唯一的二進制目錄名。

我也嘗試創建一個本地生成目錄,所以例如,將有立白/建造/ DEPS-了libx /包含配置和內置庫X(選自Y當使用時),和具有該兩個X Z和Y. 不幸的是,下一個I跑進:

add_library不能創建目標「X」,因爲具有 同名的另一個目標已經存在。現有目標是在源目錄 「libX」中創建的共享 庫。有關更多詳細信息,請參閱策略CMP0002的 文檔。

使用ExternalProject不是一個選項。

+0

我最終最終使用了http://stackoverflow.com/a/11217008/128240上的解決方案。 – ShdNx

+0

[CMake - 在同一個項目中的應用程序/庫之間的依賴關係(頭文件)]的可能重複(http://stackoverflow.com/questions/11216408/cmake-dependencies-headers-between-apps-libraries-in-same-project) – ShdNx

回答

0

X的CMakeLists.txt處理2次(從ZY都調用add_subdirectory(X))。這使得目標X定義多次,違反政策CMP0002X不是全球唯一的)

該鏈接的情況

Z-->Y--->X 
--------^ 

你不需要調用add_subdirectory(X)Z的CmakeLists。TXT

Z/CmakeLists.txt 
    add_subdirectory(Y ...) 

Y/CmakeLists.txt 
    add_subdirectory(X ...) 
+3

對,但理想情況下,我不想讓Z必須知道Y取決於X. Z唯一的擔心應該是他同時使用X和Y.有沒有強大的方法來做到這一點? – ShdNx

+0

「X」和「Y」可以在[包](http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries) – Peter

0

別人的附加應答:

我,因爲合併「錯誤」的這個錯誤。在一個較大的項目中,合併後,CMakeLists.txt在同一子目錄中兩次調用「add_subdirectory」。它會導致相同的錯誤消息。