繁体   English   中英

使用make构建时,在c ++文件中概括include语句

[英]Generalizing include statements in c++ files when building with make

您好(我使用的是Windows,mingw g ++编译器和mingw32-make)
为了概括我的问题,我想学习如何编写如下的c ++源文件:

假设foo.cpp依赖于foo.h,其中foo.cpp位于src \\中,foo.h位于include \\
// foo.cpp
#include "foo.h"

通常我会这样写
//foo.cpp
#include "..\\include\\foo.h"

但我发现随着我的项目的发展,我开始需要更多的组织,这种方法不够动态。 原因是如果我想将foo.h移动到一个新目录(比如include \\ bar \\ foo.h),我必须更改每个文件的每个包含。 有没有办法让make实现这一目标。 如果是这样,那么也可以对头文件依赖项进行操作。

附带说明一下,我是makefile的新手。 我甚至不确定它是否知道这些包含在那里,因为它们在代码中(实际上从我理解的不是)。 那将导致我遇到一个不幸的第二个问题,那就是可以看到这些问题吗? 如果不是可以改变它,它可以吗? 随意回答你将如何处理这个问题,因为我有一种感觉,我将错误的方法放在文件中,而不是将它们链接到makefile中。

编译器总是在寻找一些默认路径来查找.h文件。 您可以添加路径。

例如, gcc采用多个-I参数,其中包含一个路径。 在您的foo.cpp您可以:

#include "foo.h"

在编译时你会说:

g++ -I../include foo.cpp -c [other options]

关于问题的第二部分: makefilemake的调用通常对要编译的文件和项目一无所知。 但是有几个默认的变量和化妆指令而导致这样的印象:它可能是,在你的环境中,你只需要改变CFLAGSCPPFLAGS变量添加-I -argument,它会工作。

Patrick B已经很好地回答了如何使编译器知道从哪里包含,但不是以下几点:

附带说明一下,我是makefile的新手。 我甚至不确定它是否知道这些包含在那里,因为它们在代码中(实际上从我理解的不是)。 那将导致我遇到一个不幸的第二个问题,那就是可以看到这些问题吗? 如果不是可以改变它,它可以吗?

不,make不了解您的源文件包含什么,或它们如何依赖于其他文件[make也不真正在乎您是否使用C,C ++,Fortran,Pascal,ADA,Lisp,Cobol或Haskell进行编程-只要有一个“如果你有一个像这样的文件,并希望通过做某事的文件”文件之间的关系,make会为你排序。

有几种方法可以做到这一点。 您可以手动添加:

 foo.cpp: foo.h

或者您可以使用您的包含文件的依赖关系文件,并让make自动建造它,加入这一点,例如:

 SOURCES = foo.cpp    # Add any further source files here. 
 INCLUDES = -I../includes   # Add other include directories if needed. 

 CFLAGS += ${INCLUDES}

 TARGET = foo.exe   # in Windows. Just foo in linux/MacOS.

 all: ${TARGET} deps.mk

 ${TARGET}: ${SOURCES}
     gcc -O $@ $^      

 desp.mk: ${SOURCES}
     gcc -MM ${INCLUDES} $^ > $@

 include deps.mk

请注意,makefiles在缩进是RELYING是标签。 这篇文章使用空格,所以你需要“收看”收据。 另请注意,在“正确”的makefile中,您可以从foo.cpp等创建foo.o ,并将所有不同的.o文件链接在一起。 这样,对于大型项目,编译速度会快一些。 为了便于阅读,我简化了它。

也许我应该扩大一点:

gcc -MM给出了一个列表(标准输出)正在“编译”的文件及其所有依赖项。 它实际上不会编译代码(只要代码至少是某种程度的代码)就几乎可以编译,它将很高兴地处理您的文件。

有关gcc -MM及相关的更多详细信息,请查看GCC调用文档。

$@$&^是什么make电话“自动变量” -它们扩展到“目标”(易记,因为它看起来有点像一个目标射击箭头或类似)和“所有的依赖关系”(无恐怕这里的视觉线索-以及每隔一遍,我不得不提醒自己)。 点击这里了解更多详情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM