2011-06-14 61 views
8

我在源代碼目錄中有很多源文件。例如a.c,b.c,c.c,並希望通過gcc使用-combine選項進行編譯。Cmake和gcc結合使用

set(CMAKE_C_FLAGS "-combine") 
set(SRC a.c b.c c.c) 
add_executable(a.out ${SRC}) 

的CMake編譯在目標文件中的每個* .c文件,但我想編譯所有來源的一個對象。我怎樣才能得到這個。

在GCC的術語:

gcc -combine a.c b.c c.c -o module.o 
ar rcs library.a module.o 

但cmake的使用每個模塊翻譯的來源。

gcc a.c -o a.o 
gcc b.c -o b.o 
gcc c.c -o c.o 
ar rcs library.a a.o b.o c.o 

用聯合翻譯可以加快程序的執行速度。由於舊版本的gcc,我無法使用可以解決cmake中相同問題的LTO。

謝謝。

+0

您確定選項「-combine」存在嗎?我有一種感覺,那不是你想要做的。也許你的意思是'-fwhole-program',這在道義上等同於將所有源文件連接在一起。但更有可能的是你只是試圖建立一個可重用的庫。使用'-shared'來創建一個動態庫,或者使用'ar'程序將很多'.o'文件合併到一個靜態庫中。 CMake可以爲你自動執行。 – 2011-06-14 19:11:56

+2

是的,我確定。這個選項存在於gcc版本4.4/4.5中 – 2011-06-16 08:29:54

+0

有趣,它在4.6中消失了! :-)它的目的是什麼?任何你用'-fwhole-program'都無法實現的東西? – 2011-06-16 10:37:28

回答

1

使用add_custom_target/add_custom_command。

以任何方式它是不可移植的建設,所以在這裏簡單的例子

[項目根]有兩個文件夾,在其中[來源] - 在這裏N個文件,[建設]二進制和的CMakeLists.txt

cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) 
set(TARGET_NAME whole) 
project(${TARGET_NAME} C) 

file(GLOB SRC_FILES src/*.c) 

add_custom_target(${TARGET_NAME} ${CMAKE_C_COMPILER} -flto -fwhole-program ${SRC_FILES} -o ${TARGET_NAME}) 

在生成文件夾中運行cmake ..;使VERBOSE = 1整個

這將使你的工作。

但是,-fwhole-program只能用可執行文件工作,按照documentation

-fwhole程序 假定當前編譯單元表示整個程序被編譯。除main以外的所有公共函數和變量以及由externally_visible屬性合併的變量都成爲靜態函數,並且實際上通過過程間優化器進行了更積極的優化。

因此,你的桅杆主要定義在你的源文件的任何地方。