【问题标题】:Passing parameters to make to change #define variable [duplicate]传递参数以更改#define变量[重复]
【发布时间】:2019-06-03 07:58:39
【问题描述】:

我想通过将不同的参数传递给#define 变量,通过Makefile 多次编译C 代码。我应该把我的菜鸟手放在哪里?

在我的 C 代码中,我有一个矩阵尺寸的大小定义

#define N 500

我想在一个循环中多次编译它,但我不知道如何通过

-DN=(different sizes) 

在 Makefile 中。

作业的结构如下: 1.打扫干净 2. 使用-DN=确定大小 3. 运行性能测试并获取结果 4. 以不同的尺寸重复。

我的 Makefile 现在看起来像这样:

exe_name = exe
CC = gcc
CFLAGS =  -g -O2 -ggdb
LDFLAGS = -lm -L. -Wall -Wextra
OMPFLAGS = -fopenmp

OBJS = ompmatmul.o

default: $(exe_name)

$(exe_name): $(OBJS) 
    $(CC) -o $@ $^ $(LDFLAGS) $(OMPFLAGS)

%.o: %.c
    $(CC) -c $< -o $@ $(CFLAGS) $(OMPFLAGS) 

clean: 
    rm -f $(OBJS) $(exe_name) *~

.PHONY: clean #Don't look for a file named 'clean' 

虽然我将在其中插入 make 的循环如下:

for size in $(seq 500 500 3000); do

    make clean
    make #define_new_size
        #do_performance_and_acquire_results
done

【问题讨论】:

  • 也许我不清楚,对此感到抱歉:我想知道我是否可以通过使用 N=500 的 Makefile 来更改(尤其是如何)#define N 的大小, 1000,1500,..,3000 在我的 bash 作业的单次运行中,因此避免调整参数并为每个 N 重新编译。
  • so make size=$size 然后 gcc 命令采用 -DN=$(size)

标签: c bash makefile


【解决方案1】:

要自动化测试,基于dbush 提出的出色解决方案,您可以将以下内容添加到您的 Makefile:

SEQS := $(shell seq 500 500 3000)
TSTS := $(addprefix test-,$(SEQS))

.PHONY: tests $(TSTS)

tests: $(TSTS)

test-%:
    $(MAKE) clean
    $(MAKE) $(exe_name) N=$*
    $(MAKE) performance-test

【讨论】:

    【解决方案2】:

    要将参数传递给 make 文件,请像这样添加参数:

    make N=500
    

    那么你的 makefile 将包含:

    ifndef N
        # provide a default
        N=500
    endif
    
    ...
    
    $(exe_name): $(OBJS) 
        $(CC) -DN=$(N) -o $@ $^ $(LDFLAGS) $(OMPFLAGS)    
    

    【讨论】:

    • 效果很好,非常感谢 :)
    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多