2014-10-31 228 views
2

我喜歡在多個subdirs結構我的代碼,但我不想在每個新的子目錄中創建一個新的cmakelist.txt。cmake使用一個cmakelist.txt爲一個項目與子目錄

我的文件夾結構是這樣的:

project 
    >cmakelist.txt 
    >build 
    >src 
    >main.cpp 
    >multiple_subdirs_or_(c|h)pp_files_with_more_subdirs_or_(c|h)pp_files 

我cmakelist.txt看起來像這樣:執行後創建

源文件:

... 
file(GLOB_RECURSE cpps RELATIVE ${CMAKE_CURRENT_LIST_DIR} "src/*.cpp") 
file(GLOB_RECURSE hpps RELATIVE ${CMAKE_CURRENT_LIST_DIR} "src/*.hpp") 

#remove files with main 
list(REMOVE_ITEM cpps "src/test.cpp") 

#bins 
add_executable(test src/test.cpp src/test.cpp ${hpps} ${cpps}) 

#same problem if this is used instead of the other add_executable 
add_library(foo OBJECT ${cpps} ${hpps}) 
add_executable(test src/test.cpp $<TARGET_OBJECTS:foo>) 

與我的文件中的問題cmake沒有編譯,如果使用它們,構建失敗。 由http://www.cmake.org/cmake/help/v3.0/command/file.html在部分GLOB預測:

我們不建議使用GLOB收集源文件的列表,從 你的源代碼樹。如果在添加或刪除源 時沒有CMakeLists.txt文件更改,則生成的生成系統無法知道何時 要求CMake重新生成。

問題:是否可以使用單個cmakelist.txt用於具有多個子目錄的項目? (沒有文件(GLOB ...)的問題)

+0

您可以運行目標'讓rebuild_cache'使CMake的運行再次通配符表達式,它會拿起新的文件 - 但別人的答案建議,最好手動列出的所有文件(這意味着你將不得不在CMakeLists.txt中添加新文件,當文件更改時,cmake會自動執行rebuild_cache)。 – 2014-11-01 11:23:36

回答

4

在這裏你有兩個風馬牛不相及的事情。

首先,您可以只爲整個項目使用一個CMakeLists.txt文件嗎?是的,當然你可以(雖然在項目達到一定規模後,我個人不會這樣做),而且你已經這樣做了。

二,GLOB的問題。您已經引用了文件中指出GLOB使用有哪些問題的部分。如果您想繼續使用GLOB,目前還不能避免這種情況,因爲這是cmake設計的一部分,它可以區分配置和編譯時所做的工作。另一種方法是手動列出所有文件。無論您是在項目主目錄中的單個CMakeLists.txt文件中還是在子目錄中的多個文件中執行此操作都無關緊要。

3

要回答你的問題:是的,有可能處理一個具有多個子目錄和一個CMakeLists.txt的項目。我有兩個考慮因素需要考慮:

  1. 我強烈建議您不要使用file(GLOB ...)作爲來源。
  2. 您必須手動列出文件。例如(src/是源子目錄):

    集(CPPS的src/file1.cpp的src/file2.cpp的src/file3.cpp)

+0

這不回答他的問題「是否可以使用單個cmakelists.txt」? – 2014-11-03 11:07:45

+0

@現在它確實回答了這個問題,但我發現菲爾貝的答案更好,這就是爲什麼我提高了它的原因。 – 2014-11-03 11:18:37