2016-03-15 171 views
0

我對CMake和我有點新,我的同事決定在我們正在開發的一些項目中使用它。在這項工作中,每個人都對項目的某個模塊負責。佈局是如下CMake - 將依賴項添加到其他項目

ROOT 
    -> Module1 
    ... 
    -> Module2 (depends on Module 1) 
    ... 
    -> Module3 (depends on Module 2 and 1) 

每個[ModuleN]有自己的CMakeLists.txt文件,並且必須能夠被編譯,測試和完成後纔可以拼湊成整個項目。現在,我很困惑用什麼方法來使這些依賴關係正常工作。我的研究向我展示了一些方法(如添加[add_directory]指令等),但其中一些人抱怨說,這種方式可能會不必要地編譯項目多次(如本例中的Module1);或者需要完整的路徑。該項目不會被安裝到目標機器,所以我不能使用系統庫文件夾,包含器等。每個開發者都在不同的文件夾上有這個倉庫,所以我不能給「確切」的文件夾。我可以在[add_directory]命令中使用類似「../Module1」的語法嗎?這會導致「不必要的構建」嗎?

此外,人們通常還建議將CMakeLists.txt放置到項目的根目錄中;但我認爲這樣我們總是必須從根目錄構建 - 所以模塊不能單獨構建和測試。

什麼是「noob方式」使這成爲可能?正如我所說,我在CMake方面很新穎;老實說,我甚至不知道「關鍵字」來搜索這樣的東西(搜索「添加依賴」帶來了一些結果,我只是淹死在:))

+1

它真的是一個C++的問題嗎? – YSC

+1

這些事情是CMake的常見問題,我有類似的問題,如[CMake:如何設置源,庫和CMakeLists.txt依賴?](http://stackoverflow.com/questions/31512485/cmake-how-到設置源庫和 - cmakelists-TXT-依賴性)。我的建議可以在[首選的cmake項目結構]中找到(http://stackoverflow.com/questions/33534115/preferred-cmake-project-structure)。希望這可以幫助。 – Florian

+0

項目是一個C++項目,它計數?因此,應該相應地配置鏈接器,編譯器等。對不起,如果它不:) :) –

回答

1

把一個CMakeLists.txt文件放在根工作。這並不意味着您每次都必須編譯所有內容。當您運行cmake命令(或CMake GUI)時,您將爲整個項目生成一組makefile,一個XCode項目,MSVC解決方案等。但是你可以自由地編譯你想要的東西。你可以做到這一點的方式取決於你將選擇的一代(IDE項目,makefile,忍者文件等)。

要理解的主要事情是CMake的生成和編譯是分開的兩個步驟。

  • CMake的一代:從的CMakeLists.txt文件,生成一個項目或一個組的makefile
  • 編譯:從CMake和你的源代碼生成的「東西」,創建庫,軟件等
+0

這樣,來自項目根目錄的CMakeLists.txt應該用於子模塊的CMake生成,對吧?有沒有一個'優雅'和'簡單'的解決方案,使每個模塊?因此,Module2工作人員從她的文件夾中調用CMake,但它仍然成功添加了Module1的依賴關係:而Module3執行同樣的操作並添加了Module2和Module1依賴項......等等。 –

1

Module1中的CMakeLists.txt應創建一個庫目標[add_library(Module1 ...sources...)](例如稱爲Module1)。

Module2中的目標可以鏈接此庫[target_link_library(mytarget Module1)]。

模塊3然後可以鏈接模塊2中的目標。

您還可以使用公共和私有包含目錄來灌注目標Module1和Module2,以便使用它們的目標可以繼承包含搜索路徑。

深呼吸並閱讀文檔(兩次!)

+0

我必須以這種方式將CmakeList.txt放在項目的根目錄並從那裏調用Cmake嗎?例如,我關心的是模塊2的製造者;在他/她的模塊上工作,從她的模塊中調用Cmake;仍然可以解決Module1的依賴性。或者我們應該總是使用「頂級」Cmake來處理這種依賴關係? –

+0

這是一個很大的課題。這裏的答案太大了。但是,有一種方法是在每個下屬項目的add_subdirectory()根目錄下有一個主cmakelists。目標將意識到之前提到的目標。另外,不要從源代碼根目錄運行cmake - 從源代碼樹之外的二進制目錄運行它 - 並在第一次運行cmake時提供源代碼樹的路徑。 –

+0

我的問題是,如果Module2用戶調用Cmake,則說Module2/build目錄(直接);可以「target_link_library」仍然解決該「模塊1」?如果我不以某種方式說CMake如何找到Module1,我不認爲它可以。有沒有一種簡單的方法來做到這一點,其他的「root cmakelists.txt」?另外,我可能想要編譯整個項目(我的意思是從根目錄cmakeList.txt),所以說,Module1不應該被編譯3次,只需要一次。無論我們做什麼配置都必須完成這個任務..這部分讓我感到困惑...... –

相關問題