在C中包含源文件

时间:2009-09-14 14:38:23

标签: c build header include

所以我得到了标题与源文件的关系。我没有得到的是编译器如何知道编译所有源文件。例如:

example.h

#ifndef EXAMPLE_H
#define EXAMPLE_H

int example(int argument); // prototype

#endif

example.c

#include "example.h"

int example(int argument)
    {
    return argument + 1; // implementation
    }

main.c

#include "example.h"

main()
    {
    int whatever;
    whatever = example(whatever); // usage in program
    }

当没有包含main.c的内容时,编译器编译example()如何知道example.c的实现?

这是某种IDE的东西,你在哪里添加文件到项目和东西?有没有办法“手动”,因为我更喜欢纯文本编辑器到古怪的IDE?

5 个答案:

答案 0 :(得分:9)

在C或C ++中进行编译实际上分为两个单独的阶段。

  • 编译

编译器不知道example()的实现。它只知道有一些叫做example()的东西会在某个时候被定义。所以它只是用例如()

的占位符生成代码

然后链接器出现并解析这些占位符。

要使用gcc编译代码,您需要执行以下操作

gcc -c example.c -o example.o
gcc -c main.c -o main.o
gcc example.o main.o -o myProgram

gcc的前2次调用是编译步骤。第三个调用是链接器步骤。

答案 1 :(得分:5)

是的,您必须告诉编译器(如果您没有使用IDE,通常通过makefile)将源文件编译成目标文件,并且编译器会单独编译每个文件。然后,为链接器提供要合并到可执行文件中的目标文件列表。如果链接器正在查找函数或类定义但找不到它,则会出现链接错误。

答案 2 :(得分:4)

它不......你必须告诉它。
例如,使用gcc时,首先要编译文件:

gcc file1.c -c -ofile1.o
gcc file2.c -c -ofile2.o

然后编译器会编译这些文件,假设您定义的符号(如示例函数)存在于某处,并将在以后链接。 然后将目标文件链接在一起:

gcc file1.o file2.o -oexecutable

此时,链接器会查看这些假设并“澄清”它们,即。检查它们是否存在。这就是它基本上如何运作......

至于你的IDE问题,谷歌“makefiles”

答案 3 :(得分:1)

编译main.c时,编译器不知道example()的实现 - 编译器只知道头文件中包含的签名(如何调用它)。编译器生成.o目标文件,这些文件稍后由链接器链接以创建可执行二进制文件。构建过程可以由IDE控制,或者如果您更喜欢Makefile。 Makefile具有独特的语法,需要一些学习才能理解,但会使构建过程更加清晰。如果您搜索Makefile,网上有很多好的参考资料。

答案 4 :(得分:0)

编译器没有。但你的构建工具呢。 IDE或make工具。 手动方式是手工制作的Makefile s。