有一段代码很久没动了,今天想跑起来编译看看,突然发现出现一堆报错,如下: 好吧,首先我能保证的是,有之前调试代码过程中,这些报错一定是没有出现的。最近也没什么动作,怎么就忽然就出现了。 不管怎么说,解决问题是关键。 单纯这个报错内容来看,很典型的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找不到他的位置。
- 这个库文件的依赖丢失。
|