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

1. 文件介绍

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

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

main.c:  调用print_hello函数;

2. 编译过程

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

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

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

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

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

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

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

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

假如main.cpp想使用hello.cpp里面的函数,可以自己在main.cpp中写一个函数声明,然后就可以使用啦.

不想要头文件完全可以不用.

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

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

所以.h文件还是很有必要的,就像是储存参数的xml文件.

4. 认识链接

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

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

别的cpp定义的函数,都可以直接拿过来自己使用,只需要在文件中声明一下就可以啦.

真实情况是,在同一个文件夹并不会自动识别其他cpp定义的函数, 需要手动链接表示他们相互调用的关系:

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

在VS 下可以正常编译通过, 是因为VS自动帮我链接了.

所以VS很可恶,阻碍了我探索真理的过程?

当你在Ubuntu下进行大型软件项目地开发时,会发现手动编译链接几乎不可能,

这个时候就会求助其他编译工具或者IDE软件的, 而且用起来还不如VS...

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

猜你喜欢

转载自www.cnblogs.com/Younger-Zhang/p/10492140.html
今日推荐