2013-02-15 84 views
2

您好(我正在使用Windows,mingw g ++编译器和mingw32-make)
为了概括我的问题,我想学习如何编写如下的C++源文件:在使用make构建C++文件时推广包含语句

假设Foo.cpp中依赖foo.h中,其中Foo.cpp中在src \和foo.h中是包括\
// foo.cpp
#include "foo.h"

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

但我发现随着我的项目不断增加,我开始需要更多的组织,这种方法不够动态。原因是如果我想将foo.h移动到新目录(比如include \ bar \ foo.h),我必须更改每个文件的每个包含。有没有一种方法可以实现这一点。如果是这样的话,也可以为头文件依赖性完成。

作为一个便笺,我是新的makefile。我甚至不确定它是否知道这些包含在那里,因为它们在代码中(实际上根据我所了解的内容)。那会导致我一个不幸的第二个问题,这可以让这些包括?如果没有,是否有可能改变它,以便它可以?随意回答你将如何解决这个问题,因为我有一种感觉,我将这种错误的方式放在文件中,而不是将它们链接到makefile中。

回答

5

编译器一直在寻找一些默认路径来寻找.h文件。你可以添加你的路径。

例如gcc获取多个-I参数包含的路径。在你foo.cpp你这样做:

#include "foo.h" 

和编译时,你说:

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

关于您的问题的第二部分:makefilemake的调用通常不知道要编译的文件和有关您的项目的任何内容。然而,make中有几个默认变量和指令会导致这种印象:在您的环境中,您可能只需更改CFLAGSCPPFLAGS变量以添加-I-参数,并且它将起作用。

+0

感谢您提供非常快速的答复和直接的答案。当我再次访问该项目时,我会尝试它。 – Steven 2013-02-15 20:03:10

2

帕特里克B已经回答了关于如何使编译器很清楚知道从哪里包括但下列位:

作为一个方面说明我是新来的makefile。我甚至不知道它是否知道 这些包括在内,因为它们在代码中(实际上从 我所了解它不)。那会导致我一个不幸的 次要问题,这是否可以使这些包括?如果不是,它可以改变它,以便它可以?

没有,让不理解你的源文件包含什么,或者他们是如何依赖于其他文件[制作也并不真正关心,如果你用C,C++编程,Fortran语言,帕斯卡尔,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 [email protected] $^  

desp.mk: ${SOURCES} 
    gcc -MM ${INCLUDES} $^ > [email protected] 

include deps.mk 

注意的makefile取决于缩进是制表符。这篇文章使用空格,所以你需要“tabify”收件人。还要注意,在一个“正确的”makefile中,你可以从foo.cpp等制作foo.o,并将所有不同的.o文件链接在一起。这样,对于大型项目来说,编译速度要快一些。为了便于阅读,我简化了它。

也许我应该扩大一点点:

gcc -MM给出了一个列表(标准输出)正在“编译”和它的所有依赖的文件。它实际上并没有编译代码(只要代码至少是SOMEWHAT)接近于可编译的,它会愉快地处理你的文件。

有关gcc -MM及相关的更多详细信息,请参阅GCC invocation文档。

[email protected]$&^是什么make调用“自动变量” - 它们扩展到“目标”(易记,因为它看起来有点像在或类似的射箭目标)和“所有的依赖关系”(这里没有视觉线索,我害怕 - 而且每隔一段时间,我都必须提醒自己)。查看here了解更多详情。

+0

补充:一些编译器有一个选项,例如-M,为'make'生成一个依赖文件。 – 2013-02-15 19:35:42

+0

是的,这就是'gcc -MM'是 - '-M'还列出了标准库文件,这通常不需要在makefile中使用[因为它们通常不会经常更改,甚至更少会以实际影响的方式该程序]。 – 2013-02-15 19:38:35

+0

你和帕特里克希望完美地回答我的问题。当我找到时间来测试这个结果时,我会回复你的结果。 – Steven 2013-02-15 21:54:39

相关问题