繁体   English   中英

makefile和#include命令如何交互?

[英]How do the makefile and #include commands interact?

听起来似乎很明显,但我不清楚如何管理Makefile和#include命令。

据我了解, #include用于-根据其名称-通过指示文件头( .h )文件名来包含库文件。 它们可以位于program文件夹或某些标准库目录中。 除其他事项外, makefile指定在编译可执行文件时必须将哪些文件和程序包放在一起。

假设我想将我制作的源文件( .c.h )添加到现有程序中。 我是否需要#include并将它们添加到makefile中?

编辑-另一个问题:如果我将源文件放在makefile中,但是忘记了#include它,我会得到一个错误消息还是只是不被使用?

是的,一般而言。

#include所做的全部是包含(即从字面上粘贴)所提到的文件。 由于头文件( .h )通常仅包含声明,但不包含定义 (即实际的函数实现),因此这还不够。

这就是为什么您通常必须与链接程序 (通常来自Makefile)进行交互,以告诉它要与程序链接的其他库。

两者都是必需的,因为:

  • 尝试链接具有#include而不是正确库的程序将失败,并出现“未解析符号”类型的错误。
  • 尝试在要链接的库中调用函数,但没有正确的#include将生成“未声明符号”警告或错误。

假设您已有一个包含main.cfoo.cfoo.h的程序和一个生成该程序的makefile。 再假设你要添加bar.cbar.h

任何需要条形码的东西都必须告诉编译器在哪里可以找到它。 否则,如果Foo类具有Bar成员,并且main()调用bar_transform() ,则编译器将大声说它不知道您在说什么。 因此foo.hmain.c必须分别包含以下行:

#include "bar.h"

(这里的模式是有点微妙。请注意, foo.c可能并不需要这个指令,因为它具有#include "foo.h" ,并foo.h具有#include "bar.h" 。另外,还有一些案件最好使用前向声明 int foo.h并将指令放在foo.c 。如果对此有foo.c ,我们可以提供帮助。)

现在代码是正确的。 我们可以编译并产生main.ofoo.obar.o 我们只需要正确链接它们即可。

makefile必须包含一些内容 ,这些内容告诉Make在构建可执行文件时要使用哪些文件,也许像这样:

app: main.o foo.o
    $(CC) $^ -o $@

如果您在修改源文件后尝试这样做,Make将正确编译main.ofoo.o ,然后尝试链接它们,链接器将尖叫Bar类不完整,并且找不到bar_transform()定义。 。

要将bar合并到构建中,只需将bar.o添加到该先决条件列表中:

app: main.o foo.o bar.o
    ...

Makefile还可以通过其他方式指定列表,因此,如果遇到问题,请向我们显示您的Makefile。 同样,这也不能解决依赖关系处理的问题(例如,如果bar.h发生更改,则必须重新构建foo.o ); 这可能很容易修复,但是我们必须查看makefile。

暂无
暂无

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

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