我在源目录中有很多源文件。例如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。
感谢。
答案 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属性合并的变量都成为静态函数,并且实际上是由过程间优化器更积极地优化。
所以你的主要文件中的任何地方都定义了主要文件。