2012-04-04 36 views
12

讓我們說有以下目錄結構:cmake的:添加依賴不是子目錄

root 
    | 
    +--projects 
    |  | 
    |  +-test 
    |   | 
    |   +-CMakeFiles.txt 
    | 
    +--libs 
     | 
     +-testlib 
      | 
      +-CMakeFiles.txt 

測試包含CMakeFiles.txt和TESTLIB還含有CMakeFiles.txt。 「test」生成可執行文件,「testlib」生成靜態庫。

我想要「測試」與「testlib」鏈接,而不使用符號鏈接,也不要將「testlib」庫移動到「test」中的子目錄中。

因爲「TESTLIB」不是的「測試」的子目錄,我不能這樣做

add_subdirectory("../../libs/testlib") 

在測試的CMakeFiles.txt - cmake的會抱怨「TESTLIB」不是「測試」子目錄是。另外,因爲系統有幾個不同的編譯器,所以我不能簡單地將「testlib」庫安裝到某種中央目錄中,所以我想測試以編譯testlib的本地副本並與它鏈接(即如同testlib是一個子目錄)。我也想「測試」項目自動重建「testlib」,如果它已被更改。

那麼,我該如何處理呢? cmake 2.8.4,winxp sp3。

回答

14

您可以在root中提供頂級CMakeLists.txt,或者向add_subdirectory命令提供二進制目錄;例如

add_subdirectory("../../libs/testlib" "${CMAKE_CURRENT_BINARY_DIR}/testlib_build") 

這將創建一個在其中包含生成的項目文件TESTLIB當前的build目錄名爲testlib_build子目錄,但不能在源。

如需進一步信息,運行

cmake --help-command ADD_SUBDIRECTORY 
+0

感謝 - 這正是我需要的。 – SigTerm 2012-04-04 13:00:38

+0

@Fraser - 是否可以在testlib_build的CMakeFile中指定二進制目錄? – tower120 2015-08-09 18:49:32

+0

@ tower120 - 不,你需要在'add_subdirectory'調用中指定它。 – Fraser 2015-08-14 00:10:01

10

我看到這樣做的唯一方法 - 創建根CMakeLists.txt,並把有下面的代碼:

add_subdirectory(projects/test) 
add_subdirectory(lib/testlib) 

當你做到了這一點,你可以在測試/的CMakeLists.txt做target_link_libraries(test testlib),它會自動如果你在testlib中改變了某些東西,那麼重建它。