2011-02-23 63 views
20

我試圖將我的項目移動到CMake,同時在編譯過程中進行了一些優化。CMake:重用爲lib構建的目標文件到另一個lib目標中

這裏的交易:

  • 我有幾個子目錄所(必須的)每個編譯成一個靜態庫(這工作)。
  • 我想將每個子目錄中的所有目標文件都收集到另一個更大,完整的靜態庫中。

它看起來像這樣:

. 
libBig.a # made from object from subdir1 and subdir2 
subdir1/ 
    src/ 
    libSubdir1.a 
subdir2/ 
    src/ 
    libSubdir2.a 

今天,我設法使用全局變量,其中每個子目錄的CMakeLists.txt將追加自己的源文件。我用這個變量作爲「源」輸入我的大庫:

# the big library depends on all the source files 
# ${all_src} is automatically filled with each subdir's cpp file 
get_property(BigLib_src GLOBAL PROPERTY all_src) 
add_library(Big STATIC ${BigLib_src}) # recompiles all the sources 

現在,這個工作,不是太糟糕了,但事情是,我所有的源文件被編譯兩次:一次是針對子目錄圖書館,一次爲大圖書館。

CMake似乎忘記了它已經構建它們。

保留subdir庫和ar不能合併兩個靜態庫。

你知道該怎麼做嗎?

+0

你在移動向CMake無論如何,爲什麼? – 2011-02-24 01:52:44

+1

從手工Makefiles!我希望它很容易編譯跨平臺,易於與IDE集成,我想:爲什麼不呢? – Gui13 2011-02-24 08:58:58

回答

25

您可以使用新的OBJECT庫功能在CMake 2.8.8介紹,這個想法解釋here。基本上,對象庫是一個類似的概念,從Autotools的已知組對象文件convenience library

檢查完整的CMake OBJECT library tutorial

+1

我有同樣的問題,並嘗試了對象庫,它的魅力。謝謝 – 2012-06-25 08:34:46

3

從CMake 2.8.8開始,您可以使用OBJECT庫類型來執行此操作。見mloksot's的答案。舊的情況是,每個目標都有自己的目錄,CMake會爲每個目標構建每個依賴對象。這防止了一個源文件可能被多次使用而不同CFLAGS的情況。 (請注意,默認情況下,CMake比automake更保守:automake只有在目標是使用不同的CFLAGS(也可能是CPPFLAGS)構建時纔會停止重複使用目標文件。

+0

這就是我所做的最後,但我還是不滿意的結果,因爲現在我的CMakeLists顯得有些力不從心,並達到相同的行數比我原來的Makefile的......也許在將來的CMake的釋放。 – Gui13 2011-03-08 10:00:47

+0

您是否嘗試過使用libtool便利庫的'automake'?或者您在這一點上討厭構建系統,感到厭倦;-)?如果你從一個頂層非遞歸'Makefile.am'帶動了整個事情,你甚至不需要便利庫。 – 2011-03-08 10:18:20

相關問題