博主介绍:程序喵大人
- 35- 资深C/C++/Rust/Android/iOS客户端开发
- 10年大厂工作经验
- 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
- 《C++20高级编程》《C++23高级编程》等多本书籍著译者
- 更多原创精品文章,首发gzh,见文末
- 👇👇记得订阅专栏,以防走丢👇👇
😃C++基础系列专栏
😃C语言基础系列
由于C++
是个静态编译型语言,我们在编码时经常会遇到很多编译报错。
本文主要介绍下怎么解决编译器的报错。码字不易,欢迎大家点赞,关注,评论,谢谢!
编译单元
在这之前先介绍一下编译单元的概念。
如图,我们可以理解为编译的基本单元就是源文件,就是图中的a.cpp
、b.cpp
、c.cpp
、d.cpp
,当然,后缀名不只可以是cpp
,也可以是.c
、.cc
甚至是OC
中的.m
、.mm
等,都是编译的基本单元。
当一个项目中有多个源文件时,即有多个.cpp
时,编译器首先会对他们进行单独编译,比如a.cpp
会被编译成a.o
,b.cpp
会被编译成b.o
等。
将它们都编译完,生成.o
后,编译器会进行下一步操作,编译器会把所有的.o
组装到一起,这个过程叫做链接,链接成功后就会生成一个可以执行的程序。
如果在将.cpp
变成.o
过程中出现了错误,一般称之为编译时错误,当在link
的过程中出现错误时,一般称之为链接时错误。
所以在平时编译器报错时,我们要先区别开当前的报错是编译时错误还是链接时错误。
编译时错误有很多,我们一般按照编译器的提示更改即可,比如:
这种就是编译时错误,编译器会明显提示我们哪里报了错,甚至连在哪一行出了问题都知道。
看上面的提示,明显是没有找到变量a
,我们根据报错的行号和对应的报错信息,去相应的修改即可。
当然,这是我列举的最简单的一个错误,真正的项目肯定比这复杂的多,编译器报错也会比这复杂。
然而编译器还是很贴心的,到时候随机应变,根据编译器报错去修改就行。
但有些情况下编译器报的错会比较复杂,以至于我们完全看不懂,只能靠猜和二分法,逐步缩小范围来定位问题。
一般出现复杂情况,多数都是因为我们使用了宏或者使用了模板操作,所以如果你还不能完全驾驭宏或者模板,或者项目需求不复杂,根本没必要使用它们时,就尽量不要碰这些洪水猛兽。
我们再继续看一段代码:
这段代码就会报错:undefined reference
,这种undefined reference
的错误一般就是链接时错误,表示找不到某个函数的实现。
因为它的函数是在其它源文件中定义实现的,而我们却没有链接,所以才会报错。
那怎么改动?
可以把定义此函数的编译单元链接上,在test2.cc
中定义了func
函数的实现。
再将test2.cc
也放到clang
的编译链接中,整个可执行程序就会成功生成。
练习
- 编译单元是什么?
- 什么是编译时错误?怎么解决?
- 什么是链接时错误?怎么解决?
C++训练营
专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍