【ChernoC++笔记】C++链接
▶️mingw的编译过程
编译过程分为四个步骤:预处理、编译、汇编、链接。
- 预处理:使用
g++ -E learn.cpp -o learn.i
命令,预处理后得到learn.i文件;- 编译:成汇编代码的过程,使用命令
g++ -S learn.i -o learn.s
生成汇编文件learn.s文件,当然直接从learn.cpp文件得到汇编文件也可以;- 汇编:将汇编代码转化成机器指令,生成目标二进制代码。使用命令
g++ -c learn.s -o learn.o
生成test.o文件;- 链接:通过链接库文件,将目标文件转化成可执行文件。使用命令
g++ learn.o -o learn.exe
。
❓为什么通常是.h文件声明,.cpp文件定义?
- 防止include .h的时候多次重复定义,造成链接错误。
▶️两个相同的函数,有相同的参数和返回值,会造成链接错误:链接器不知道链接哪一个函数。
- 解决方法1:将函数定义为static函数,可以将该函数局限在文件内部,对其他obj文件不可见;
- 解决方法2:使用inline(将函数调用替换为实际的函数体);
- 解决方法3:将函数定义移动到一个翻译单元中,在.h文件中仅声明,也就是现在常用的做法。
❓同样的标准头文件在几个翻译单元中都有,为什么不会造成链接错误?
- 标准头文件只有函数声明,没有函数定义。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)