makefile中的宏?有条件的h文件包含?

时间:2016-09-14 11:29:11

标签: c++ c makefile

让我解释一下我的情况: 我有一个包含不同类型模型的程序(让我们说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进行编译。

非常感谢任何帮助!

2 个答案:

答案 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>

接下来,让我们更明智地指出模型。不要使用MODEL1MODEL2等,而是使用带有模型名称的通用MODEL变量,因此make命令看起来像MODEL=model1 make(如果有单独的变量)这是一个很难的要求,有很多方法可以做到这一点ifdef s,但它仍然是丑陋的。)

此时编写Makefile变得微不足道了:

SRCS := models/$(MODEL)/model.cu main.c
OBJS := $(addsuffix .o,$(basename $(SRCS)))
CFLAGS += -Imodels/$(MODEL)

我不知道你以后如何在Makefile中处理SRCSOBJS所以我只是使用addsuffixbasename来打{{1}在那里,但你可以根据自己的需要改变它。我通过.o将模型目录添加到包含路径中,以便它选择正确的CFLAGS

你也可以指定这样的来源:

model.h

因为make会查看VPATH := models/$(MODEL) SRCS := model.cu main.c 来源。

一些misc内容:如果您仍然需要C VPATH,则可以通过#define添加它。如果您的CFLAGS文件中有一些常见内容,请考虑将其重构为顶级.h,然后.h。如果您的编译器支持它,#include <model.h>也可能很方便。