在本视频中, 我们将讨论链接器错误及其发生的原因｡
链接器错误发生在链接器试图将程序的所有部分组合在一起以创建可执行文件时,
但缺少一个或多个部分｡
通常, 当链接器找不到目标文件或库时, 就会发生这种情况｡
修复链接器错误可能很棘手｡
有时候, 这只是一个获得正确路径的问题, 这样链接器就知道丢失的部分在哪里｡
让我们转向code light, 我们将强制一个程序有一个链接器错误, 这样你就可以看到错误消息是什么样子的｡
这里的示例代码, 请忽略语法｡
这实际上是C++代码, 但它仍然与链接器错误有关｡
不要担心i o流｡
不要担心stdcout｡
这里的主要思想是链接错误在C和C++中是相同的｡
这里的代码示例只是试图再次演示链接器错误｡
所以我在代码灯, 我已经创建了一个项目称为链接器错误的基础上, 我们使用的模板｡
所以我只有一个主节点｡ cpp文件, 上面写着Hello world｡
现在我们要在这里强制一个链接器错误｡
这不是您通常想要做的事情, 但我想这样做是为了向您展示错误的样子｡
所以我要说的是, extern, int, c, 或者说, X, 我马上会解释给你们听｡
然后在主体中, 我想尝试使用这里的X｡
它只是一个整数, 我想把它打印出来｡
我只想打印出X, 就这么简单｡
我要把它保存起来｡
现在你会看到如果我编译这个程序, 你会看到发生了什么｡
我将右键单击编译｡
我得到一个干净的编译｡
程序没有问题, 但是当我试着构建和运行它的时候｡
您可以看到链接器错误｡
这是典型的链接器错误｡
对某事物的未定义引用｡
在这种情况下, 它恰好是x｡
另外, 您会注意到链接器在这里返回了一个｡
LD返回退出状态｡
所以链接出了问题｡
显然编译器是好的, 因为我们没有得到编译器错误｡
我们再来一次｡
这是编译｡
没有错误, 没有警告｡
我来解释一下这是怎么回事｡
让我拿一下我的手写笔｡
这里发生的是, 我在这里有我的主CPP文件, 它将被编译为, 比如说,
主点对象｡
在这里, 我们有一个引用一个EXE｡
就在那里｡
所以在这里我有一个对exe的引用, 我将使用它｡
现在我们也有了O流库, 所以链接器需要获取这些库, 我在这里输入i, o, stream,
这样你们就知道我在说什么了｡
链接器需要把这两个一起创建我的主exe｡
或者在这种情况下, 我相信这将是链接器错误exe｡
但你知道我的意思｡
所以编译是好的｡
我们已经创建了目标文件｡
这个图书馆存在｡
问题是我已经告诉编译器这个x不在我里面｡
在别的地方
它是由别人定义的｡
很明显, 它不是由其他人定义的, 因为这就迫使这个问题出现在这里｡
所以现在链接器需要解析X, 它说, 好的, 我从哪里得到要打印的值？
因为这是你让我在这里做的, 对吗？
我想让它打印出x的值｡
x在哪里？
它找不到它｡
这是链接器错误｡
就是这样
让我再构建一次, 这样您就可以再次看到错误消息｡
它是建立它和运行它｡
这是错误信息｡
它说的是对X的未定义引用｡
你可以清楚地看到发生了什么｡
找不到X｡
这不是一个编译器错误｡
这是一个链接器错误｡
这一点非常重要｡
链接器错误很难修复｡
很多时候你需要链接的文件丢失了｡
他们在错误的地方｡
你不必担心在本课程中使用代码光, 我们基本上会自己做所有事情｡
但是如果你使用的是第三方的库, 这是我们在中级或高级课程中会讨论的｡
但我只是想向你展示链接器错误的情况下, 你拿出一个, 在论坛上发布它, 我们将通过它一起工作｡