08、如何解决编译器报的错误

厨子大约 3 分钟C++C++基础编程程序厨

由于C++是个静态编译型语言,我们在编码时经常会遇到很多编译报错。

本文主要介绍下怎么解决编译器的报错。

编译单元

在这之前先介绍一下编译单元的概念。

暂时无法在飞书文档外展示此内容

如图,我们可以理解为编译的基本单元就是源文件,就是图中的a.cppb.cppc.cppd.cpp,当然,后缀名不只可以是cpp,也可以是.c.cc甚至是OC中的.m.mm等,都是编译的基本单元

当一个项目中有多个源文件时,即有多个.cpp时,编译器首先会对他们进行单独编译,比如a.cpp会被编译成a.ob.cpp会被编译成b.o等。

将它们都编译完,生成.o后,编译器会进行下一步操作,编译器会把所有的.o组装到一起,这个过程叫做链接,链接成功后就会生成一个可以执行的程序。

如果在将.cpp变成.o过程中出现了错误,一般称之为编译时错误,当在link的过程中出现错误时,一般称之为链接时错误

所以在平时编译器报错时,我们要先区别开当前的报错是编译时错误还是链接时错误。

编译时错误有很多,我们一般按照编译器的提示更改即可,比如:

img
img

这种就是编译时错误,编译器会明显提示我们哪里报了错,甚至连在哪一行出了问题都知道。

看上面的提示,明显是没有找到变量a,我们根据报错的行号和对应的报错信息,去相应的修改即可。

当然,这是我列举的最简单的一个错误,真正的项目肯定比这复杂的多,编译器报错也会比这复杂。

然而编译器还是很贴心的,到时候随机应变,根据编译器报错去修改就行。

但有些情况下编译器报的错会比较复杂,以至于我们完全看不懂,只能靠猜和二分法,逐步缩小范围来定位问题。

一般出现复杂情况,多数都是因为我们使用了宏或者使用了模板操作,所以如果你还不能完全驾驭宏或者模板,或者项目需求不复杂,根本没必要使用它们时,就尽量不要碰这些洪水猛兽。

我们再继续看一段代码:

img
img

这段代码就会报错:undefined reference,这种undefined reference的错误一般就是链接时错误,表示找不到某个函数的实现。

暂时无法在飞书文档外展示此内容

因为它的函数是在其它源文件中定义实现的,而我们却没有链接,所以才会报错。

那怎么改动?

可以把定义此函数的编译单元链接上,在test2.cc中定义了func函数的实现。

再将test2.cc也放到clang的编译链接中,整个可执行程序就会成功生成。

暂时无法在飞书文档外展示此内容

练习

  • 编译单元是什么?
  • 什么是编译时错误?怎么解决?
  • 什么是链接时错误?怎么解决?