g++编译逻辑的简单理解

1. 文件介绍函数

hello.cpp:   有一个输出"hello"的函数 void print_hello();spa

hello.h:  对print_hello()函数的声明;xml

main.c:  调用print_hello函数;get

 

 

2. 编译过程编译器

g++ -c hello.cpp  编译生成hello.o的目标文件编译

g++ -c main.cpp   编译生成main.o的目标文件程序

g++ hello.o main.o -o main 把目标文件连接生成main的可执行文件文件

指令须要记一下, -c + 被编译的文件, -o + 生成的文件名.时间

目标文件和可执行文件均为同一种文件类型.co

 

 

3. 编译&连接和.h头文件有什么关系?

其实,编译&连接和头文件没有半毛钱的逻辑关系~

惟一的关系就是,谁家cpp文件里面有include XX.h,就会把这个.h的内容拷贝到本身文件里面,其余都是cpp本身的事情

假如main.cpp想使用hello.cpp里面的函数,能够本身在main.cpp中写一个函数声明,而后就可使用啦.

不想要头文件彻底能够不用.

 

话是这么说,可是main使用的函数比较多,声明就写一大堆;

假如别人扔给你一个.o文件,不给看源代码,你也没办法使用别人的函数.

因此.h文件仍是颇有必要的,就像是储存参数的xml文件.

 

 

4. 认识连接

目标文件生成可执行文件的过程称为连接.

我以前认为,同一个文件夹下的不一样cpp文件,是好兄弟关系,

别的cpp定义的函数,本身能够直接拿来用!

——这确定是错误的,至少要声明一下呀!可是这种错误的观点我一直忘不掉,过一段时间就须要纠正一次!

 

因此,兄弟cpp定义的函数,不能直接使用的,由于使用以前须要声明一下.

——这在VS,Keil等编译器中确实是这样。

 

真是状况是,声明只是告诉编译器有这个函数及其调用方式,可是真正运行的时候,到底去哪里找这个函数呢?

迄今为止,我并未告诉系统运行程序时去哪里寻找须要调用的函数,并且在同一个文件夹并不会自动识别其余cpp定义的函数,

因此,咱们须要手动连接表示他们相互调用的关系:

g++ hello.o main.o -o main 把目标文件连接生成main的可执行文件

 

因此IDE真的是很方便,让咱们都意识不到存在连接这回事!

 

参考: https://www.jianshu.com/p/e5c6a255076b

相关文章
相关标签/搜索