如何使用gcc和make为每个优化级别编译成二进制文件?
我有一个sourcefile如何使用gcc和make为每个优化级别编译成二进制文件?,c,gcc,makefile,gnu-make,C,Gcc,Makefile,Gnu Make,我有一个sourcefilebenchmark.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 我想有一个更一般的方法。
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
我想有一个更一般的方法。
提前谢谢。您正在考虑for循环
all:
for level in O0 O1 O2 O3; do \
gcc benchmark.c -$level benchmark-$level \
done
你在考虑一个for循环
all:
for level in O0 O1 O2 O3; do \
gcc benchmark.c -$level benchmark-$level \
done
您可以遍历一个单词列表,每个单词都包含设置优化选项的数字,每次调用调用相应命令的罐装配方时:
LIST := 0 1 2 3
define RUN
gcc benchmark.c -o benchmark-O$1 -O$1
endef
all:
$(foreach variable,$(LIST),$(call RUN,$(variable)))
您可以遍历一个单词列表,每个单词都包含设置优化选项的数字,每次调用调用相应命令的罐装配方时:
LIST := 0 1 2 3
define RUN
gcc benchmark.c -o benchmark-O$1 -O$1
endef
all:
$(foreach variable,$(LIST),$(call RUN,$(variable)))
既然您假设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 $@
baseexe:=基准
级别:=0 1 2 3秒
文件:=$(foreach级别,$(级别),$(baseexe)-O$(级别))
全部:$(文件)
$(文件):$(baseexe).c
gcc$(subst$(baseexe),,$@)$<-o$@
这里有两三种魔力:
make变量的定义使用GNU的files
make函数从基本名称和优化级别列表构建目标文件列表foreach
- (跟随您)目标文件的名称对优化选项进行编码,因此
- 构建方法可以并且确实使用GNU的
make函数从每个目标名称中提取优化选项subst
您必须判断,对于您的目的而言,这个有点晦涩难懂的8行(包括两行空白)makefile是否比您开始使用的更好。至于我,我会选择你简单明了的起始版本。既然你假设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 $@
baseexe:=基准
级别:=0 1 2 3秒
文件:=$(foreach级别,$(级别),$(baseexe)-O$(级别))
全部:$(文件)
$(文件):$(baseexe).c
gcc$(subst$(baseexe),,$@)$<-o$@
这里有两三种魔力:
make变量的定义使用GNU的files
make函数从基本名称和优化级别列表构建目标文件列表foreach
- (跟随您)目标文件的名称对优化选项进行编码,因此
- 构建方法可以并且确实使用GNU的
make函数从每个目标名称中提取优化选项subst
您必须判断,对于您的目的而言,这个有点晦涩难懂的8行(包括两行空白)makefile是否比您开始使用的更好。至于我,我会选择你简单明了的起始版本。你想自动化哪部分?更重要的是,你已经有了一些看起来很有效的东西,而且非常清晰和简单,那么它到底有什么问题?你想自动化它的哪一部分?更重要的是,你已经有了一些看起来很有效的东西,而且非常清晰和简单,那么它到底出了什么问题呢?