解决”symbol lookup error”问题

ubuntu9.10 + eclipse + CDT,开发一个Linux下的C/C++服务器程序,开发工作已经接近尾声,也就是说,之前的几个动态库引用啥的都没问题了,可有一天突然发现在编译主程序(可执行程序)时,提示:

/usr/bin/ld: cannot find -lsendclient

这是找不到sendclient.so文件导致的。

我是这样引用各个so动态库文件的:

在/etc/ld.so.conf中输入如下内容:

include /etc/ld.so.conf.d/*.conf

用于包含/etc/ld.so.conf.d/目录下的所有*.conf文件。

然后在/etc/ld.so.conf.d/目录下为每个引用到的so建立.conf文件,我用到的有好多个了,所以建了很多个文件,并在相应文件中记录so所在的目录:

analysis.conf      ==>   /home/hyh/jobman/analysis/Debug/

sendclient.conf ==> /home/hyh/jobman/sendclient/Debug/

task.conf ==> /home/hyh/jobman/task/Debug/

核实以上路径都没问题后,到sendclient项目查看其配置文件,发现原来是生成文件的名字不知道怎么被修改成了task:

改成sendclient,编译成功。

接下来问题远远没有解决。

在运行可执行程序时,居然提示说没有函数定义:

/home/hyh/jobman/loader/Debug/loader: symbol lookup error: /home/hyh/jobman/loader/Debug/loader: undefined symbol: _ZN7TaskManC1Ev

然后就退出了,是不是很奇怪?程序可以运行,却执行到new TaskMan()时找不到符号,然后退出。

这显然不会是ld的路径造成的了,着实摸不着头脑了。

用ldd看看loader.exe程序的依赖项和他们的路径:

 libUtility.so => /home/hyh/jobman/Utility/Debug/libUtility.so (0x001e5000)
libtask.so => /home/hyh/jobman/sendclient/Debug/libtask.so (0x00f95000)
libsendclient.so => /home/hyh/jobman/sendclient/Debug/libsendclient.so (0x0054f000)

……

还真有斩获:libtask.so 的路径指向了sendclient,显然是链接的时候出了问题 ,可是怎么看配置文件也没啥问题啊!!!

只能是一个个排查吧,与之相关联的就是exe程序、sendclient和task三个项目。好在浏览sendclient时发现Debug目录下面赫然显示有task.so文件存在:

这下终于真想大白了:

上一个失误在sendclient的Debug目录下面生成了一个task.so,结果在编译和链接可执行程序时eclipse自动链接了sendclient/Debug目录下的task.so,但执行的时候是按照ld.conf.d目录下的配置文件进行装载的,结果找不到相应的task.so符号文件,从而找不到task.so中的函数。

修正,重新编译并运行一下,又出现如下错误:

/home/hyh/jobman/loader/Debug/loader: error while loading shared libraries: libtask.so: cannot open shared object file: No such file or directory

这下好说了,运行“ldd loader”看看,发现:

 libUtility.so => /home/hyh/jobman/Utility/Debug/libUtility.so (0x00bf4000)
libtask.so => not found

运行 “sudo ldconfig”重新装载一下配置文件,刷新一下缓存,再次运行就OK了:

hyh@hyh-Ubuntu:~/jobman/loader/Debug$ sudo ldconfig
hyh@hyh-Ubuntu:~/jobman/loader/Debug$

解决”symbol lookup error”问题》有33个想法

发表评论

电子邮件地址不会被公开。