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

如何使用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 我想有一个更一般的方法。

我有一个sourcefile
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$@
这里有两三种魔力:

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

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

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


您必须判断,对于您的目的而言,这个有点晦涩难懂的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$@
这里有两三种魔力:

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

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

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


您必须判断,对于您的目的而言,这个有点晦涩难懂的8行(包括两行空白)makefile是否比您开始使用的更好。至于我,我会选择你简单明了的起始版本。

你想自动化哪部分?更重要的是,你已经有了一些看起来很有效的东西,而且非常清晰和简单,那么它到底有什么问题?你想自动化它的哪一部分?更重要的是,你已经有了一些看起来很有效的东西,而且非常清晰和简单,那么它到底出了什么问题呢?