[英]How do the makefile and #include commands interact?
是的,一般而言。
#include
所做的全部是包含(即从字面上粘贴)所提到的文件。 由于头文件( .h
)通常仅包含声明,但不包含定义 (即实际的函数实现),因此这还不够。
这就是为什么您通常必须与链接程序 (通常来自Makefile)进行交互,以告诉它要与程序链接的其他库。
两者都是必需的,因为:
#include
而不是正确库的程序将失败,并出现“未解析符号”类型的错误。 #include
将生成“未声明符号”警告或错误。 假设您已有一个包含main.c
, foo.c
, foo.h
的程序和一个生成该程序的makefile。 再假设你要添加bar.c
和bar.h
。
任何需要条形码的东西都必须告诉编译器在哪里可以找到它。 否则,如果Foo
类具有Bar
成员,并且main()
调用bar_transform()
,则编译器将大声说它不知道您在说什么。 因此foo.h
和main.c
必须分别包含以下行:
#include "bar.h"
(这里的模式是有点微妙。请注意, foo.c
可能并不需要这个指令,因为它具有#include "foo.h"
,并foo.h
具有#include "bar.h"
。另外,还有一些案件最好使用前向声明 int foo.h
并将指令放在foo.c
。如果对此有foo.c
,我们可以提供帮助。)
现在代码是正确的。 我们可以编译并产生main.o
, foo.o
和bar.o
。 我们只需要正确链接它们即可。
makefile必须包含一些内容 ,这些内容告诉Make在构建可执行文件时要使用哪些文件,也许像这样:
app: main.o foo.o
$(CC) $^ -o $@
如果您在修改源文件后尝试这样做,Make将正确编译main.o
和foo.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.