2016-03-05 89 views
0

我的C++項目非常大,會生成5個不同的二進制文件。例如,在VStudio中,我的單一解決方案有5個不同的「項目」。例如,在XCode中,我的單個項目有5個不同的目標。CMake從常見源樹生成多個項目的方法

該代碼被組織在一個非常深的「src」文件夾中,其中包含多個嵌套子文件夾。這個src文件夾對所有5個二進制文件都是通用的,因爲大部分源代碼都被大量重用,但每個二進制文件都需要一些源代碼,但不是全部。

我想知道如何有效地創建一個CMakeList.txt,可以創建我所需要的。

注:

  • 疏理代碼到一個不同的結構是不是一種選擇也不是使代碼一堆靜態庫。
  • 每個子文件夾的CMakeList.txt不是一個選項。其中有太多,維護將是一場噩夢。
  • 的文件(GLOB_RECURSE是也不是因爲它會拿起一噸的源文件的每個二進制是不需要編譯特定的二進制一個很好的選擇。
  • 理想情況下,XCode項目(含5個目標)或者一個VStudio溶液(5個項目)將被生成。我不想5個不同的項目來打開。

我將與需要手動從列表巨頭添加/刪除源文件的某處完全的內容。 ..在一個可以被CMake吸收的外部文件中。例如SourceFilesForBinary1.txt,SourceFilesForBinary2.txt等,但我不知道如何做到這一點,或者如果這是瘋了。

任何意見,將不勝感激。

回答

1

CMake具有包含功能。您可以使用它來實現您的「巨大的手動管理列表某處」解決方案。

你知道GLOB_RECURSE被賦予了一個模式,對,所以它排除了不感興趣的文件嗎?即使不是,在任何地方你都可以使用GLOB_RECURSE,你也可以使用include和邪惡的手動管理列表。

我不知道你爲什麼不想要靜態庫。這是解決這個問題的好辦法。對於大量這樣的共享代碼,如果您將其編譯一次到可重定位靜態庫中,然後將其與LTO鏈接到各種用途,則可避免多次重新編譯源代碼。如果您的使用是共享庫(所以靜態庫方法會讓所有未使用的符號消失),您可以使用--whole-archive編譯器開關來保存它們。

+1

作爲一般說明,如果對一個不明原因的「不解決它就像這個」子句的關聯列表提出問題是非常沒有幫助的。如果你解釋爲什麼你拒絕了他們每個人,其他人可能會發現你錯過的東西,這使他們成爲你的問題的解決方案! –

+0

我實際上使用include()以及「target_sources」來實現我所希望的。這讓我可以爲每個目標單獨製作一個「小型生成文件」,以保持目標特定設置和源代碼不受大部分CMake邏輯的影響。 – cjserio