Cmake和gcc结合在一起

时间:2011-06-14 16:45:27

标签: gcc cmake

我在源目录中有很多源文件。例如a.c,b.c,c.c,并希望通过gcc使用-combine选项编译它。

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

使用combine进行翻译可以加快程序的性能。由于旧版本的gcc,我无法使用可以解决cmake中同样问题的LTO。

感谢。

1 个答案:

答案 0 :(得分:1)

使用add_custom_target / add_custom_command。

无论如何它都是非便携式结构,所以这里是简单的例子

[project root]里面有两个文件夹[src] - 这里是N个文件,[build]是二进制文件,还有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})

在build文件夹中运行cmake ..;使VERBOSE = 1整个

这将使你的工作。

但是,根据documentation,-fwhole-program只能使用可执行文件。

  

-fwhole程序   假设当前编译单元代表正在编译的整个程序。除main之外的所有公共函数和变量以及由attribute_visible属性合并的变量都成为静态函数,并且实际上是由过程间优化器更积极地优化。

所以你的主要文件中的任何地方都定义了主要文件。