Loading

【ChernoC++笔记】C++链接

【7】C++链接器是如何工作的

▶️mingw的编译过程

参考资料

编译过程分为四个步骤:预处理、编译、汇编、链接

  1. 预处理:使用g++ -E learn.cpp -o learn.i命令,预处理后得到learn.i文件;
  2. 编译:成汇编代码的过程,使用命令g++ -S learn.i -o learn.s生成汇编文件learn.s文件,当然直接从learn.cpp文件得到汇编文件也可以;
  3. 汇编:将汇编代码转化成机器指令,生成目标二进制代码。使用命令g++ -c learn.s -o learn.o 生成test.o文件;
  4. 链接:通过链接库文件,将目标文件转化成可执行文件。使用命令g++ learn.o -o learn.exe

❓为什么通常是.h文件声明,.cpp文件定义?

  • 防止include .h的时候多次重复定义,造成链接错误。

▶️两个相同的函数,有相同的参数和返回值,会造成链接错误:链接器不知道链接哪一个函数。

  • 解决方法1:将函数定义为static函数,可以将该函数局限在文件内部,对其他obj文件不可见;
  • 解决方法2:使用inline(将函数调用替换为实际的函数体);
  • 解决方法3:将函数定义移动到一个翻译单元中,在.h文件中仅声明,也就是现在常用的做法。

❓同样的标准头文件在几个翻译单元中都有,为什么不会造成链接错误?

  • 标准头文件只有函数声明,没有函数定义。
posted @ 2023-07-04 16:09  rthete  阅读(39)  评论(0)    收藏  举报