让我解释一下我的情况:
我有一个包含不同类型模型的程序(让我们说10,但实际数字非常高)。所有这些模型都有一个名称和相应的文件" model1.cu"和" model1.h"。所有这些文件都有一个函数,它产生一个浮点数并返回它,它在所有名为相同的文件中,具有相同的参数(让我们说float returnfunction(float voltage)
)。主文件中需要此特定功能。
在makefile中我添加了一个选项,使您只编译要计算的模型的代码,如下所示:
ifdef MODEL1
SRCS := model1.cu
OBJS := model1.o
endif
ifdef MODEL2
SRCS := model2.cu
OBJS := model2.o
endif
SRCS += main.c
现在我可以通过键入" make MODEL1 = 1"来选择正确的模型。问题出现在主文件中。函数returnfunction(float voltage)
在model1.h中定义,所以我应该包含它。但是当我加入
#ifdef MODEL1
#include "model1.h"
#endif
#ifdef MODEL2
#include "model2.h"
#endif
在我的main.c文件中,我得到的错误是函数returnfunction
没有在任何地方定义。
有没有办法让我的主文件中包含正确的h文件?最好通过使用我已经使用MODEL1 = 1进行编译。
非常感谢任何帮助!
答案 0 :(得分:2)
您可以为您拥有的每个模型简单地将预处理器定义添加到Makefile中。例如,在MODEL1 = 1的情况下:
ifdef MODEL1
SRCS := model1.cu
OBJS := model1.o
CFLAGS += -DMODEL1
endif
假设您使用的是implicit rules,修改后的CFLAGS
将被传递给每个已编译的文件。如果你使用自己的规则来编译main.c(并且没有使用CFLAGS
),那么你可以创建一个变量,并明确地传递它。
答案 1 :(得分:1)
另一个答案就是重点并修复了您遗失的#define
。我将扩展我在清洁/干燥方式上留下的评论。
第一部分是每个模型都在自己的目录中,具有共同的源/头名称。例如:
├── models
├── model1
│ ├── model.cu
│ └── model.h
├── model2
│ ├── model.cu
│ └── model.h
└── ...
(您可能会删除顶级models
目录,无所谓)
我们将使用包含路径,因此您可以从#ifdef
中删除整个main.c
内容,并将其替换为单个#include <model.h>
。
接下来,让我们更明智地指出模型。不要使用MODEL1
,MODEL2
等,而是使用带有模型名称的通用MODEL
变量,因此make命令看起来像MODEL=model1 make
(如果有单独的变量)这是一个很难的要求,有很多方法可以做到这一点ifdef
s,但它仍然是丑陋的。)
此时编写Makefile变得微不足道了:
SRCS := models/$(MODEL)/model.cu main.c
OBJS := $(addsuffix .o,$(basename $(SRCS)))
CFLAGS += -Imodels/$(MODEL)
我不知道你以后如何在Makefile中处理SRCS
和OBJS
所以我只是使用addsuffix
和basename
来打{{1}在那里,但你可以根据自己的需要改变它。我通过.o
将模型目录添加到包含路径中,以便它选择正确的CFLAGS
。
你也可以指定这样的来源:
model.h
因为make会查看VPATH := models/$(MODEL)
SRCS := model.cu main.c
来源。
一些misc内容:如果您仍然需要C VPATH
,则可以通过#define
添加它。如果您的CFLAGS
文件中有一些常见内容,请考虑将其重构为顶级.h
,然后.h
。如果您的编译器支持它,#include <model.h>
也可能很方便。