之前写TLPI上的代码一直是手动进行错误处理,感觉代码冗余量很大,最后还是决定使用书上的tlph_hdr.h,顺便回顾下动态库的创建/使用。

参考很久之前的一篇博客 linux上静态库和动态库的编译和使用

但是感觉这篇博客写了后我一直没真正用过动态库,于是花了些时间复习下,结果倒好,一直出问题。

xyz@ubuntu:~/lib$ ls
a.out f.c g.c h.c libutil.so main.c util.h

f.c g.c h.c分别是3个函数f()、g()、h()的定义,util.h是这3个函数的声明,main.c包含了util.h,并在main()函数中调用了这3个函数。

a.out则是成功生成的程序,生成过程如下

xyz@ubuntu:~/lib$ gcc f.c g.c h.c -fpic -shared -o libutil.so
xyz@ubuntu:~/lib$ gcc main.c -L. -lutil

第一步编译了3份包含函数具体实现的源文件,第二步编译了主程序。

其中-L.将当前目录设为动态库查找位置,-lutil代表查找的动态库为libutil.so,这只是语法糖,这句命令用libutil.so替换-lutil也可以。

最后运行a.out时报错

./a.out: symbol lookup error: ./a.out: undefined symbol: f

自己瞎折腾半天不知道原因,起初怀疑动态库生成错误,没有包含3个函数,但是命令并没错。最后还是动用搜索引擎,试着用ldd(1)来查看程序依赖库(ldd的使用在TLPI的第3章 3.3中查找glibc共享库的位置时也使用过)

xyz@ubuntu:~/lib$ ldd a.out
linux-vdso.so. => (0x00007fff509eb000)
libutil.so => /usr/lib/x86_64-linux-gnu/libutil.so (0x00007f1a9e581000)
libc.so. => /lib/x86_64-linux-gnu/libc.so. (0x00007f1a9e1b7000)
/lib64/ld-linux-x86-.so. (0x000055fcfc069000)

原因出来了,系统自带了一个libutil.so,我自定义的动态库和它重名了,由于动态库是优先查找系统路径(再其次是-L后面的路径,在这里是当前目录),系统自带的libutil.so自然不会有f() g() h()这三个函数,因此f()被认为是未定义的符号,即找不到函数f()的具体定义。

只要改个名字就行了,然后就遇到了下面错误

xyz@ubuntu:~/lib$ gcc f.c g.c h.c -fpic -shared -o libfgh.so
xyz@ubuntu:~/lib$ gcc main.c -L. -lfgh
xyz@ubuntu:~/lib$ ./a.out
./a.out: error while loading shared libraries: libfgh.so: cannot open shared object file: No such file or directory

最好的解决方式还是把动态库目录加到环境变量里,而不是把动态库随便扔个系统目录。

xyz@ubuntu:~/lib$ export LD_LIBRARY_PATH=$(pwd)
xyz@ubuntu:~/lib$ echo $LD_LIBRARY_PATH
/home/xyz/lib
xyz@ubuntu:~/lib$ ./a.out
f()
g()
h()

运行成功,然而这个环境变量重启后就没了,所以需要把它添加到在~/.bashrc末尾,此时就需要把当前目录用绝对路径表示了

export LD_LIBRARY_PATH=/home/xyz/lib 

这样系统重启之后便仍可运行a.out,如果需要通知系统.bashrc文件已更新,可用命令source ~/.bashrc

写动态库时遇到了symbol lookup error问题的更多相关文章

  1. Linux:编译动态库时遇到的错误relocation R_X86_64_32 against `a local symbol'

    编译动态库时遇到如下错误: ... ... relocation R_X86_64_32 against `a local symbol' can not be used when making a ...

  2. linux c编程调用系统的动态库时,要使用dlopen等函数吗?

    同问 linux c编程调用系统的动态库时,要使用dlopen等函数吗? 2012-11-27 21:55 提问者: hnwlxyzhl 我来帮他解答 满意回答 2012-12-07 09:08 li ...

  3. vs指定QT的工作目录(依赖第三方动态库时,这时vs编译出来后,运行会提示缺少动态库)good

    当一个工程依赖第三方动态库时,这时vs编译出来后,运行会提示缺少动态库.解决方法: 项目->属性->调试: 工作目录:指定程序运行时的目录 环境:指定程序运行时的环境变量 我们可以在环境变 ...

  4. 由一次 symbol lookup error 引发的思考

    开发一个跨平台的项目的时候,大部分时候都是在VS下进行编码,所以也就使用了VS的解决方案来管理项目. 因为要跨平台,当时网上看scons这个工具不错,所以在linux下就使用了scons来作为编译脚本 ...

  5. ldd "symbol lookup error"问题解决

    http://www.linuxquestions.org/questions/slackware-14/symbol-lookup-error-usr-lib-libgtk-x11-2-0-so-0 ...

  6. symbol lookup error *** , undefined symbol 错误

    在重装samba过程后遇到一些问题,使用 gdb 时产生报错: gdb: symbol lookup error: gdb: undefined symbol: PyUnicodeUCS2_FromE ...

  7. symbol lookup error

    今天编译代码时出现这样的错误提示: “./test: symbol lookup error: ./test: undefined symbol: ……” 问题原因是:test使用的动态库和makef ...

  8. fastDfs V5.02 升级到 V5.08版本后,启动报错:symbol lookup error: /usr/bin/fdfs_trackerd: undefined symbol: g_current_time

    /libfastcommon-1.0.36 # ./make.sh cc -Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -g -O3 -c -o hash.o ...

  9. centos perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql.so: undefined symbol: mysql_init

    之前在安装天兔数据库监控工具lepus的时候,运行时一直报perl: symbol lookup error: /usr/local/lib64/perl5/auto/DBD/mysql/mysql. ...

随机推荐

  1. vue打包体积优化之旅

    webpack 与 vue 在使用vue开发时,遇到打包后单个文件太大,因而需要分包,不然加载时间太久.虽然尽可能减少请求次数,但是单个包太大也不是好事 思路 组件按需加载 vue-router 的懒 ...

  2. hdu 4081 Qin Shi Huang's National Road System 树的基本性质 or 次小生成树思想 难度:1

    During the Warring States Period of ancient China(476 BC to 221 BC), there were seven kingdoms in Ch ...

  3. redis在.net架构中的应用(1)--利用servicestack连接redis

    引言:作为少有的.net架构下的大型网站,stackoverflow曾发表了一篇文章,介绍了其技术体系,原文链接http://highscalability.com/blog/2011/3/3/sta ...

  4. 链表实现队列C语言写法

    #include<iostream> #include<cstdio> #include<cstdlib> using namespace std; typedef ...

  5. PentesterLab-From SQL Injection to Shell

    一.打开靶机ip出现如下界面: 随便点一下,点到test链接,访问了如下url:http://192.168.109.131/cat.php?id=1,这里出现了一个id,常规思路这个位置可能有sql ...

  6. 关于微信中JS-SDK的接口验证过程详细说明

    最近在做微信的企业服务号,刚开始通过个人的测试平台进行开发,使用了自定义菜单,自定义菜单包含两个功能:1.扫一扫,通过扫描我们账单的二维码,绑定账户和账单的关系:2.打开我们系统的账单查询页面,查询账 ...

  7. pcm ulaw alaw转换

    static byte ALawCompressTable[] = { 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5 ...

  8. Inception 初探

    1,安装 下载组件 wget clone https:/github.com/mysql-inception/inception.git rz ll unzip inception-master.zi ...

  9. Okhttp之连接池ConnectionPool简单分析(一)

    开篇声明:由于本篇博文用到的一些观点或者结论在之前的博文中都已经分析过,所以本篇博文直接拿来用,建议读此博文的Monkey们按照下面的顺序读一下博主以下博文,以便于对此篇博文的理解: <Okht ...

  10. [置顶] 普通程序员如何入门AI

    毫无疑问,人工智能是目前整个互联网领域最火的行业,随着AlphaGo战胜世界围棋冠军,以及各种无人驾驶.智能家居项目的布道,人们已经意识到了AI就是下一个风口.当然,程序员是我见过对于新技术最敏感的一 ...