Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ makefile中的宏?条件h文件包含?_C++_C_Makefile - Fatal编程技术网

C++ makefile中的宏?条件h文件包含?

C++ makefile中的宏?条件h文件包含?,c++,c,makefile,C++,C,Makefile,让我解释一下我的情况: 我有一个包含不同类型模型的程序,比如说10个,但是实际的数量相当高。所有这些模型都有一个名称和相应的文件model1.cu和model1.h。所有这些文件都有一个函数,该函数生成一个浮点数并返回它,它在所有名为相同的文件中,具有相同的参数,比如说float returnfunctionfloat voltage。主文件中需要此特定函数。 在makefile中,我添加了一个选项,这样您就可以只编译要计算的模型的代码,如下所示: ifdef MODEL1 SRCS := mo

让我解释一下我的情况: 我有一个包含不同类型模型的程序,比如说10个,但是实际的数量相当高。所有这些模型都有一个名称和相应的文件model1.cu和model1.h。所有这些文件都有一个函数,该函数生成一个浮点数并返回它,它在所有名为相同的文件中,具有相同的参数,比如说float returnfunctionfloat voltage。主文件中需要此特定函数。 在makefile中,我添加了一个选项,这样您就可以只编译要计算的模型的代码,如下所示:

ifdef MODEL1
SRCS := model1.cu
OBJS := model1.o
endif

ifdef MODEL2
SRCS := model2.cu
OBJS := model2.o
endif

SRCS += main.c
现在,我可以通过键入makemodel1=1来选择正确的模型。问题出现在主文件中。函数returnfunctionfloat voltage是在model1.h中定义的,所以我应该包括它。但当我包括

#ifdef MODEL1
#include "model1.h"
#endif

#ifdef MODEL2
#include "model2.h"
#endif
在我的main.c文件中,我得到一个错误,函数returnfunction没有在任何地方定义。 有没有办法在我的主文件中包含正确的h文件?最好是使用MODEL1=1进行编译


非常感谢您的帮助

对于您拥有的每个模型,只需将预处理器定义添加到Makefile中即可。例如,在MODEL1=1的情况下:

ifdef MODEL1
SRCS := model1.cu
OBJS := model1.o
CFLAGS += -DMODEL1
endif

假设您使用的是,修改后的CFLAGS将传递给编译的每个文件。如果您使用自己的规则编译main.c,而没有使用CFLAGS,那么您可以创建一个变量,并显式地传递它。

另一个答案是切中要害,并修复缺少的定义。我将详细介绍我留下的关于清洁/烘干方法的评论

第一部分是将每个模型放在自己的目录中,并使用通用的源/头名称。例如:

├── models
    ├── model1
    │   ├── model.cu
    │   └── model.h
    ├── model2
    │   ├── model.cu
    │   └── model.h
    └── ...
您可以删除顶级模型目录,这无关紧要

我们将使用include路径,这样您就可以从main.c中删除整个ifdef内容,并将其替换为单个include

接下来,让我们对如何指定模型更聪明一点。不要使用MODEL1、MODEL2等。让我们使用一个通用的模型变量,该变量采用模型名称,因此make命令看起来像MODEL=MODEL1 make。如果很难要求使用单独的变量,那么在没有大量ifdef的情况下,有很多方法可以做到这一点,但它仍然更难看

此时,编写Makefile变得很简单:

SRCS := models/$(MODEL)/model.cu main.c
OBJS := $(addsuffix .o,$(basename $(SRCS)))
CFLAGS += -Imodels/$(MODEL)
我不知道您稍后在Makefile中如何处理src和obj,所以我只是使用addsuffix和basename在其中添加了一个.o,但是您可以根据需要更改它。我通过CFLAGS将model目录添加到include路径中,以便它能够选择正确的model.h

您还可以指定如下来源:

VPATH := models/$(MODEL)
SRCS := model.cu main.c
因为make将研究VPATH中的源代码


一些杂项:如果你仍然需要一个C定义,你可以通过CFLAGS添加它。如果在.h文件中有一些常见的内容,请考虑将其重构为顶层。如果您的编译器支持,那么include_next可能也很方便。

顺便说一句,一种更简洁的方法是将每个模型放在一个单独的子目录中,其中包含名为model.cu和model.h的文件。设置VPATH并从makefile中添加-I标志,然后您可以设置SRCS:=model.cu,OBJS:=model.o并将其包含在main.c中。我喜欢您的想法,但是您可以指定VPATH和-I的用法吗?我不熟悉makefile中所有可能的选项,文档对我来说通常很难理解。我想知道的是,您在makefile中放置的行假设映射名为:NewModel,它包含model.cu和model.ht我得到的其余概念。它是否类似于:ifdef MODEL1 VPATH=-I./NewModel endif?对于注释来说太长了,所以我写了一个答案,它基本上会删除其中的每个ifdef。这只是一个建议,被接受的答案将修复您发布的代码。