【问题标题】:Cmake and gcc combineCmake 和 gcc 结合
【发布时间】: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 更重要。

标签: gcc cmake


【解决方案1】:

使用 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 完整

这将为您完成工作。

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

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

所以你在源文件的任何地方都定义了 main。

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 2013-05-08
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多