2011-10-19 67 views
9

我試圖使用CMake的(在Linux上使用GNU使和g ++)建設項目有兩個子目錄:MyLib中和MyApp的。 MyLib包含靜態庫的源代碼; MyApp需要鏈接到該庫。我試圖使用下面的CMakeLists.txt在生成的makefiles上構建Linux:CMake的:建立圖書館,並連接它

cmake_minimum_required (VERSION 2.6) 
project (MyProj) 
include_directories (MyLib) 
file(GLOB MyLibSrc MyLib/*.cpp) 
add_library(MyLibrary STATIC ${MyLibSrc}) 
file(GLOB MyAppSrc MyApp/*.cpp) 
add_executable(MyApplication ${MyAppSrc}) 
target_link_libraries(MyApplication MyLibrary) 

這'幾乎'起作用。它在鏈接時失敗,因爲它生成libMyLibrary.a - 它在根中。當我加入:

link_directories(${MyProj_BINARY_DIR}) 

它沒有區別。

我有幾個(相互關聯的)問題:

  1. 什麼是強迫的cmake投入建設我的圖書館和可執行成一個「臨時目錄」 —說MyStage —保持目標分離的最佳方法來自源?
  2. 如何說服cmake將應用程序與庫鏈接?
  3. 如果我想建立一個調試和發佈版本,什麼是延長我的CMake的腳本來做到這一點—做出最好的方式確保對調試庫,並釋放庫發佈應用程序調試應用程序鏈接?

我是一個相對較新的cmake的。我已經閱讀了我能在網上找到的內容,但發現自己正努力讓我的圖書館與我的可執行文件鏈接。在我看來,這種配置應該是相當普遍的。一個例子從哪個嬰兒牀將是非常有益的,但我沒有找到一個。

回答

3
  1. 使用「超出源版本」。做只爲建立和,而在它使用的目錄,請撥打

    cmake <path to the sources, it may be relative>
  2. 要麼使用

    link_directories(${MyProj_BINARY_DIR}/MyLib)

    或作出的CMakeLists.txt每個子目錄 - 這將是項目比非常小更大更好。

  3. 這有點棘手,請檢查文檔中的CMAKE_BUILD_TYPE(您可以設置它和/或「if」)。您也可以通過命令行來設置它:

    cmake -DCMAKE_BUILD_TYPE=Debug
+0

我可以看到(1)如何工作的 - 儘管我不認爲這是整潔。如果我可以提供幫助,我不需要在我的圖書館旁邊的「臨時目錄」中使用CMakeLists.txt。 – aSteve

+0

Uhm,不,不,CMakeLists.txt停留在源碼樹中。作爲參數傳遞給cmake的路徑是包含頂級CMakeLists.txt的目錄。在這個設置中,「暫存」目錄在cmake調用之前是完全空的。 – kralyk

3

我發現了 '最優' 的解決方案(1)...所以,認爲我應該張貼在這裏:

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage) 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage) 

之前讓我困惑的是靜態庫不被Cmake認爲是庫 - 它們被認爲是ARCHIVE。

+0

我發現的唯一有用答案!命名很混亂! – rationalcoder

15

嗯,這是更好的閱讀example做究竟是什麼建議。

cmake_minimum_required (VERSION 2.6) 
project (MyProj CXX) 
add_subdirectory(MyLib) 
add_subdirectory(MyApp) 

然後對於指定的每個子目錄CMakeLists。TXT文件被創建

MyLib中\的CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_library(MyLib ${SRC_FILES}) 

MyApp的\的CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_executable(MyApp ${SRC_FILES}) 
target_link_libraries(MyApp MyLib)