一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
预处理:头文件展开,宏替换,条件编译,去掉注释等等。
预处理其中最重要的是头文件展开,以Func.h,Func.cpp,Test.cpp为例,头文件展开会生成两个文件,Test.i,Func.i。其中Test.i包含函数的声明和实际调用,Func.i包含函数的声明和定义。
编译:检查语法,生成汇编代码--Func.s,Test.s.其中只有声明,还没有找到确切的地址
汇编(不是汇编代码,是一个步骤):转换成二进制的机器码,生产Func.o,Test.o.
链接:合并到一起,链接一些没有确定函数地址等等,生成a.out.
如果一个函数只有声明没有定义,就会导致链接错误.
以上没有理解也不重要,重要的是:
链接的时候需要找到函数的地址,c语言链接函数地址直接寻找的是函数名,而c++(Linux下)的函数名修饰规则改为_Z函数名字符个数 函数名 参数首字母.也就意味着函数的类型不同,函数修饰出来的名字就不同.