我可以使用makefile来生成具有不同#defines的多个可执行文件吗?

时间:2014-03-07 20:57:43

标签: c makefile

编辑:我现在明白它是C语言中的标准练习,但我需要知道它是如何实现的。我可以得到一个实现这个的makefile的例子吗?例如,如何指示exe应该以递增的整数后缀命名? -DFOO在哪里:#去?

就像我说的,我正在阅读GNU make文档,但它很厚。

〜修改

我想做什么是可能的,但文档很重。

https://www.gnu.org/software/make/manual/make.html#toc_Rules

我需要能够从源代码编译多个可执行文件,每个可执行文件在标头中使用不同的常量定义。认为...

.exe1 needs to have
...#DEFINE FOO 2

.exe2 needs to have
...#DEFINE FOO 4

.exe3 needs to have
...#DEFINE FOO 16

为了澄清,我的程序有以下标题:

#define DATASIZE 16777216 //16MB
#define NUM_PROCESS 10
#define NUM_COMPS   1

我编写了这个用于衡量代码性能的bash脚本:

#!/bin/bash
for i in {1..5};
do
   ./usr/bin/time -p exe$1 >> exe_output$1 &2>1
done

如您所见,这是通过以下方式执行的:

for i in {1..n};
do 
   ./run.sh $i
done

其中n是我编译的可执行文件的数量。

现在,为了更改每个exe中的定义(以及性能),我必须打开源并手动更改它。我想编译12到16个不同的可执行文件,并且手动完成所有操作变得乏味,所以我正在寻找一种以编程方式执行此操作的方法。

2 个答案:

答案 0 :(得分:3)

exe1: source.c
    $(CC) -DFOO=2 ... 

exe2: source.c
    $(CC) -DFOO=4 ...

exe3: source.c
    $(CC) -DFOO=16 ...

等等,其中...是其余的编译选项。

答案 1 :(得分:0)

使用这样的Makefile:

exe%: source.c
    $(CC) -DFOO=$(@:exe%=%) $^ -o $@

其中定义pattern rule以匹配以exe开头的所有内容。然后,它使用substitution reference $(@:exe%=%)来提取定义的数字。

然后您可以在bash脚本中使用它,如下所示:

for i in {1..n};
do 
   make exe$i
   ./run.sh $i
done

它将按需生成所需的可执行文件。