【问题标题】:How to compile into a binary for each optimization level with gcc and make?如何使用 gcc 和 make 为每个优化级别编译成二进制文件?
【发布时间】:2017-03-07 19:11:45
【问题描述】:

我有一个源文件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

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

【问题讨论】:

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

标签: c gcc makefile gnu-make


【解决方案1】:

你在考虑一个 for 循环吗?

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

【讨论】:

    【解决方案2】:

    既然您假设使用 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 是否比您开始使用的更适合您的目的。至于我,我会采用你简单明了的起始版本。

    【讨论】:

      【解决方案3】:

      您可以遍历一个单词列表,每个单词都包含设置优化选项的数字,并且每次调用一个调用适当命令的罐头配方:

      LIST := 0 1 2 3
      
      define RUN
      
      gcc benchmark.c -o benchmark-O$1 -O$1
      
      endef   
      
      all:  
          $(foreach variable,$(LIST),$(call RUN,$(variable)))
      

      【讨论】:

        猜你喜欢
        • 2020-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多