问题描述
|
我在源目录中有许多源文件。例如a.c,b.c,c.c,并希望通过带有-combine选项的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的旧版本,我无法使用LTO来解决cmake中的相同问题。
谢谢。
解决方法
使用add_custom_target / add_custom_command。
无论如何,它都是非便携式构造,因此这里是简单示例
[项目根目录],其中有两个文件夹[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})
在生成文件夹中运行cmake ..;使VERBOSE = 1整
这将为您工作。
但是,根据文档,-fwhole-program仅适用于可执行文件。
-整个程序
假设当前的编译单元代表正在编译的整个程序。除main之外的所有公共函数和变量,以及由属性externally_visible合并的那些公共函数和变量,都变为静态函数,实际上是由过程间优化器更积极地优化的。
因此,您可以在源文件中的任何位置定义main。