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定义的函数,不能直接使用的,因为使用之前需要声明一下.
——这在VS,Keil等编译器中确实是这样。
真是情况是,声明只是告诉编译器有这个函数及其调用方式,但是真正运行的时候,到底去哪里找这个函数呢?
迄今为止,我并未告诉系统运行程序时去哪里寻找需要调用的函数,而且在同一个文件夹并不会自动识别其他cpp定义的函数,
所以,我们需要手动链接表示他们相互调用的关系:
g++ hello.o main.o -o main 把目标文件链接生成main的可执行文件
所以IDE真的是很方便,让我们都意识不到存在链接这回事!