Cmake和gcc结合在一起

Igo*_*kov 8 gcc cmake

我在源目录中有很多源文件.例如ac,bc,cc,并希望通过带有-combine选项的gcc编译它.

set(CMAKE_C_FLAGS "-combine")
set(SRC a.c b.c c.c)
add_executable(a.out ${SRC})
Run Code Online (Sandbox Code Playgroud)

Cmake编译目标文件中的每个*.c文件,但我想将所有源代码编译为一个对象.我怎么能得到这个.

就gcc而言:

gcc -combine a.c b.c c.c -o module.o
ar rcs library.a module.o
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Ser*_*lov 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})
Run Code Online (Sandbox Code Playgroud)

在构建文件夹中运行 cmake ..; 使 VERBOSE=1 完整

这将为您做好工作。

但是,根据文档, -fwhole-program 仅适用于可执行文件。

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

因此,您必须在源文件中的任何位置定义 main 。