编辑:我现在明白它是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个不同的可执行文件,并且手动完成所有操作变得乏味,所以我正在寻找一种以编程方式执行此操作的方法。
答案 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
它将按需生成所需的可执行文件。