2009-09-14 104 views
5

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

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()实施没事的时候含udes example.c

这是某种IDE的东西,你添加文件到项目和东西?有没有办法做到“手动”,因为我更喜欢一个纯文本编辑器来离奇的IDE?

回答

5

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

+0

所以这就是makefile进来的地方,总是想知道它们适合在哪里。谢谢。 – 2009-09-14 14:46:47

0

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

4

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

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

然后编译器编译这些文件,假设您已经定义(比如你的例子功能)符号存在地方和意志在后来被链接。 那么你的目标文件链接在一起:

gcc file1.o file2.o -oexecutable 

在这个时间点,链接器会查看这些assumtions和“澄清”他们即。检查他们是否在场。这是它的基本工作原理...

至于你的IDE的问题,谷歌“生成文件”

+0

你的意思是'-c',而不是'-S',否则你不应该使用'.o'作为输出。 – 2009-09-14 14:46:53

+0

@hacker谢谢。固定...很难阅读一长页的选项... – aviraldg 2009-09-14 14:52:58

9

C或C++编译实际上分成两个独立的阶段。

  • 编译

编译器不知道的例子的实现()。它只知道有一些叫做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分调用被编译步骤。第三个调用是链接器步骤。

+0

我认为你的意思是gcc -c main.c -o main.o在第2步。 – baskin 2010-01-14 11:34:46

+0

@baskin,是的,我做到了。感谢捕捉。固定。 – Glen 2010-01-14 12:08:51

1

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