编译时,无法链接的错误处理

文章讲述了作者在使用VScode和CMake编译C++代码时遇到链接错误,发现是由于编辑器中文件内容未保存导致编译器仅处理了空头文件。解决过程揭示了VScode编辑器的一个鲜为人知的问题:如果不保存,可能导致链接失败。
摘要由CSDN通过智能技术生成

编译一个代码时,使用VScode编辑,Cmake工具链编译C++代码,出现了一个报错,提示:无法链接。

/usr/bin/ld: cubic_spiral.cpp:(.text+0xed1): undefined reference to `IntegrateBySimpson'

使用nm工具分析.o文件,发现没有符号输出

使用objdump也检查没有任何符号输出

objdump -t CMakeFiles/path_plan.dir/integral.cpp.o

但是,源代码里面明明是有代码的,故而检查CMakeLists文件,确保其已经包含。为了确保其包含,更改了源文件的命名,发现了一个奇怪的现象:

对应的头文件的命名已经修改为“my_integral.h”文件,但是,在“my_integral.h”中,依然包含的是“integral.h”文件,神奇的事情发生了,编译过程中,系统居然能编译通过,没有报错。

经过一个漫长而痛苦的分析,终于发现了,使用vscode加vim编辑可能存在的问题,问题就是:

如果不使用:w保存文件,则vscode编辑器中的文件内容和在硬盘上的内容可能是不一致的,更重要的是,使用g++编译器的时候,g++编译器只检查了文件的头文件,并不对函数的实现进行检查。换句话说,就是如果你定义了一个头文件,问cpp文件为空,则g++编译器能编译通过。两者相结合,问题就出现了,你以为你写好了代码,但其实没有保存,g++编译时候,只编译了一个空文件,导致的结果就是链接不上。

文件链接不上,有很多种原因,比较完善的可以参考网址:

https://www.cnblogs.com/bwbfight/p/14279192.html

但是,上面的原因实在太过于诡异,知道原因,1s中解决,但是,如果不知道,我是花了两周来解决。


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值