链接的接口——符号(一)链接错误:symbol lookup error: xxx, undefined symbol: xxx

问题

在ubuntu16电脑上运行编译好的qt demo出报错
错误信息如下:

./abc_product: symbol lookup error: ./abc_prodcut: undefined symbol: ModuleInit

明显是找不到对应符号

难道是依赖的sdk库出错?
但是明明同一个程序在测试笔记本上是可以工作的啊

检查了一下libsdk.so里面的动态库

nm libsdk.so | grep ModuleInit
0000000000000000000b2e70 T ModuleInit

结果也显示存在这个符号的啊,这就奇怪了

ldd

ldd主要用来查看程序依赖库,结果主要包括三种,程序需要依赖什么库;系统提供的与程序需要的库所对应的库;库加载的开始地址

解决

使用ldd命令,查看了一下abc_product链接的动态。
发现默认链接的libsdk.so是home目录下的,就是开始编译执行文件时候的指定的动态库的目录,但是执行的时候已经重新指定的搜索目录的,难道不起作用吗?

原来动态库是有先后搜索顺序的,动态库的搜索路径搜索的先后顺序是:


1.编译目标代码时指定的动态库路径;
2.通过LD_LIBRARY_PATH指定的搜索路径;
3./etc/ld.so.conf中指定的动态库搜索路径;
4./lib;/usr/lib


因此即使使用第2步通过export重新指定动态库的搜索路径,但是在编译执行文件时候指定的动态库的搜索路径中仍然存在相同名字的动态库的话,还是以后者为链接库。
确定了一下,在home目录下确实有相同的库,只不过是之前的版本,因此怪不得找到不需要的符号。

所以这里只需要将home下旧版本的库重新换个位置或者删除掉,在第2步指定一下搜索路径就可以了。

你可能感兴趣的:(问题)