有一段代码很久没动了,今天想跑起来编译看看,突然发现出现一堆报错,如下:

好吧,首先我能保证的是,有之前调试代码过程中,这些报错一定是没有出现的。最近也没什么动作,怎么就忽然就出现了。

不管怎么说,解决问题是关键。

单纯这个报错内容来看,很典型的undefined reference to的报错,这个报错在调用第三方库的编程中,简直是家常便饭,代表的含义也很明确,就是找不到函数的定义。

用C++写代码的都知道,在C++中,代码是分为声明和定义的,声明就是告诉编译器有这个函数,换言之,就是个名字,而定义,就是具体这个函数的实现内容。

类似这个报错的,还会有一种报错是undeclared的报错,这大概就是函数声明的报错。

言归正传,undefined reference to的报错一般怎么处理

应该首先想到是不是没有对应的库文件,于是我去/usr/local/lib目录下找libgdal.so.26,能找到。
如果库文件在,那也可能是Qt没找到这个库,那就手动外部导入库试试,发现没用

当发现上述两点都不是原因之后,说明从这里能获取的报错信息就不足以解决这个问题了,于是,这个时候,就把目光转移到编译输出的那个tab页中,查找蛛丝马迹。然后就发现了问题的关键。在编译输出的内容中,有这样的报错

/usr/bin/ld: warning: libxerces-c-3.2.so, needed by /usr/local/lib/libgdal.so.26, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libnetcdf.so.15, needed by /usr/local/lib/libgdal.so.26, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libhdf5_serial.so.103, needed by /usr/local/lib/libgdal.so.26, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libogdi.so.4.1, needed by /usr/local/lib/libgdal.so.26, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libCharLS.so.2, needed by /usr/local/lib/libgdal.so.26, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libgeotiff.so.5, needed by /usr/local/lib/libgdal.so.26, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libcfitsio.so.8, needed by /usr/local/lib/libgdal.so.26, not found (try using -rpath or -rpath-link)

问题就明显了,缺少了很多的libgdal的依赖库,这个就让我很摸不着头脑了,明明之前没有这些报错,说明依赖都没问题的,怎么突然就出现问题了。我认真回忆了一下,怀疑可能是在卸载别的软件的时候,利用sudo apt autoremove时,把一些依赖给误删了。

问题是很好解决的,就是把缺的依赖再给他装上去就好了,特别提醒一下,别的依赖都好找,直接sudo apt install XXXXX多试几回,基本也就找到了,这其中有两个库不是很好找,libmfhdfalt和libdfalt,这两个库需要安装libhdf4-alt-dev来解决。

那么总结一下,出现undefined reference to报错的可能原因有三条:

没有这个库文件。

库文件有,但是Qt找不到他的位置。

这个库文件的依赖丢失。

转自:https://blog.csdn.net/baidu_31788709/article/details/123094382

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐