【发布时间】:2011-09-14 21:05:17
【问题描述】:
我在源目录中有很多源文件。例如 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,我无法使用 LTO,它可以解决 cmake 中的相同问题。
谢谢。
【问题讨论】:
-
您确定存在
-combine选项吗?我有一种感觉,这不是你想要做的。也许您的意思是-fwhole-program,这在道德上相当于将所有源文件连接在一起。但更有可能你只是想制作一个可重用的库。使用-shared制作动态库,或者只使用ar程序将大量.o文件组合成一个静态库。 CMake 可以为您自动化。 -
是的,我确定。此选项存在于 gcc 版本 4.4/4.5
-
有趣,它在 4.6 中消失了! :-) 它的目的是什么?用
-fwhole-program做不到的任何事情? -
是的,4.6 没有 -combine,但我们的团队使用 gcc-4.3 和 4.4。 -fwhole-program 和 combine 有同样的问题,因为它需要在一个编译单元中编译所有源文件以创建 1 个目标文件。
-
我也想知道这个问题的答案。我目前正在使用自定义 Makefile 系统而不是 CMake,但我想切换。但是通过模块间优化的性能比 CMake 更重要。