如何使用gcc和make为每个优化级别编译成二进制文件?

时间:2017-03-07 19:11:46

标签: c gcc makefile gnu-make

我有一个源文件benchmark.c,我想用每个编译器优化级别构建它。 有没有办法自动实现这一点,而不是像这样手动提供每一个标志?

all:
    gcc benchmark.c -o benchmark-O0 -O0
    gcc benchmark.c -o benchmark-O1 -O1
    gcc benchmark.c -o benchmark-O2 -O2
    gcc benchmark.c -o benchmark-O3 -O3

我想要一个更通用的方法。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

您是否考虑过for循环?

all:
    for level in O0 O1 O2 O3; do \
        gcc benchmark.c -$level benchmark-$level \
    done

答案 1 :(得分:1)

您可以遍历一个单词列表,每个单词都包含设置优化选项的数字,每次调用一个调用相应命令的固定配方:

LIST := 0 1 2 3

define RUN

gcc benchmark.c -o benchmark-O$1 -O$1

endef   

all:  
    $(foreach variable,$(LIST),$(call RUN,$(variable)))

答案 2 :(得分:1)

由于您正在使用GNU make,因此您可以使用GNU功能,例如函数。这是你可以做的工作的一种方式,在我看来是一个合理的类似成语:

baseexe := benchmark
levels  := 0 1 2 3 s
files   := $(foreach level,$(levels),$(baseexe)-O$(level))

all: $(files)

$(files): $(baseexe).c
    gcc $(subst $(baseexe),,$@) $< -o $@

那里有两三个魔法:

  • files make变量的定义使用GNU的foreach make函数从基本名称和优化级别列表构建目标文件列表。

  • (关注您)目标文件的名称对优化选项进行编码,因此

  • 构建配方可以并且确实使用GNU的subst make函数从每个目标名称中提取优化选项。

你必须判断这个有点神秘的8行(包括两个空白)makefile是否比你开始时更适合你的目的。至于我,我会采用简单易用的起始版本。