传递参数以更改#define变量[重复]

Posted

技术标签:

【中文标题】传递参数以更改#define变量[重复]【英文标题】:Passing parameters to make to change #define variable [duplicate] 【发布时间】: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) 【参考方案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)    

【讨论】:

效果很好,非常感谢 :)

以上是关于传递参数以更改#define变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

更改 httpservletrequest 参数然后传递请求 [重复]

传递参数 Byreference 以提高速度和效率

将变量传递给注入的服务以用作装饰器参数

如何更改作为参数传递的变量的值?

如何使用箭头函数在更改事件上传递参数“this”[重复]

在函数c ++中将变量作为默认参数传递[重复]