升级perl后遇到export symboll lookup error问题求助

2979人阅读
Technorati Tags: ,,
今天编程遇到问题,我对一个类不加namespace的时候是对的,运行完全正确。可是我加上namespace的时候,编译都对,但是就是运行时出错:
../bin/test_gbr: symbol lookup error: ../bin/test_gbr: undefined symbol: _ZN3gbr9ksdensityC1EPKdiiSsSs。
我以为是namespace的名字有冲突,就改了个名字,发现还是一样错。然后测试其它同样有namespace的类,没有问题,单单这个类有问题。
找同学帮忙,google了一下,“namespace class symbol lookup error c++&,第一条就是答案:.
转载全文如下:
I was working on a c++ project. Everything linked and compiled fine. Upon running the executable, I got the following error:
./TestCppProgram: symbol lookup error: ./TestCppProgram: undefined symbol: _ZN12CppProgramC1Ev
I searched the internet. Two of the interesting links I found were the following:
For me it ended up being a bad LD_LIBRARY_PATH. The path I intended the executable to find it's needed shared library was in the LD_LIBRARY_PATH, it just wasn't before a different path which had an older version of the needed shared library. (This happened to me when I updated by bashrc with a library path and just re-sourced it).
Some cool commands in the debugging process:
ldd TestCppProgram (Shows you where your program is getting it's libraries from. An early-on careful inspection of this would've quickly let me to my problem!)
ldd -d -r TestCppProgram (Shows you any undefined symbols. There shouldn't be any undefined symbols for an executable, but there will be for a shared lib if it depends on another shared lib. Somebody please correct me if I'm wrong)
nm TestCppProgram | c++filt (displays unmangled symbol information)
nm TestCppProgram (Displays mangled symbol information. Ie: You should be able to find stuff like ZN12CppProgramC1Ev in here. In my problem above, I found which line number the undefined symbol in question was on, and then looked it up in the unmangled version to see what function it was trying to resolve. It let me know, but it didn't really help me find out what my problem was.)
readelf -d TestCppProgram (Shows library dependencies. similar to ldd.)
发现我的问题与作者是一样的。我的gbr需要编译成shared library,然后我会安装到$USR_LIB这个我自己的目录下。但是每次我重新编译gbr时,新生成的libgbr.so在本地目录,并没有自动安装到$USR_LIB目录下,因而$USR_LIB里的libgbr.so一直是旧的,就是没有用namespace的情况。在运行可执行文件时,系统自动找到$USR_LIB里的libgbr.so并未更新,所以每次都会出错。
问题找到了,解决办法很简单,更新$USR_LIB里的libgbr.so为最新编译的。然后测试,运行正确。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:23796次
排名:千里之外
原创:25篇
(2)(3)(2)(2)(1)(3)(3)(2)(1)(1)(2)(2)(4)(1)(1)(1)58cv网址导航新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分357 UID阅读权限50积分3420帖子精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
小富即安, 积分 3420, 距离下一级还需 1580 积分
帖子主题精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
论坛徽章:1
大家好:我想请问一下linux系统下怎么能找某个命令依赖的包呢?比如说vmstat,perl?(意思就是装了哪些包就可以用perl或vmstat命令了)
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分2318 UID阅读权限90积分43486帖子精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
富甲一方, 积分 43486, 距离下一级还需 6514 积分
帖子主题精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
论坛徽章:24
你想实现什么结果呢 ?
如果你发现我的回复跟你说的不是一回事, 那么, 偶是来抬杠的. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
如果你发现我的回复正好是你想知道的, 那么, 是俺蒙对了. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
空间积分0 信誉积分357 UID阅读权限50积分3420帖子精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
小富即安, 积分 3420, 距离下一级还需 1580 积分
帖子主题精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
论坛徽章:1
& & 我现在是在RHEL6.4上 perl&&-version查看了一下版本是5.10.1的,我的某个perl脚本在5.4系统上(perl版本是5.8.8)跑着没问题,在6.4上跑报了一个错误,错误详细信息如下:
& & /usr/bin/perl: symbol lookup error: ./auto/DBD/Oracle/Oracle.so: undefined symbol: Perl_Tstack_sp_ptr
& &我想是不是这个6.4系统perl版本过高引起的,所以我想重新装个5.4系统上的perl,不知道这个perl命令是依赖哪些包?
空间积分0 信誉积分2318 UID阅读权限90积分43486帖子精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
富甲一方, 积分 43486, 距离下一级还需 6514 积分
帖子主题精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
论坛徽章:24
gguxxing008
这跟 perl 本身没有关系.
是 DBD::Oracle 的问题.
你确定你的机器上装了 oracle client的相关 lib 么?
如果你发现我的回复跟你说的不是一回事, 那么, 偶是来抬杠的. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
如果你发现我的回复正好是你想知道的, 那么, 是俺蒙对了. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
空间积分0 信誉积分357 UID阅读权限50积分3420帖子精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
小富即安, 积分 3420, 距离下一级还需 1580 积分
帖子主题精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
论坛徽章:1
& & 这台机器是一台Oracle数据库服务器,oracle系统要求装的包都装了,那这会是什么问题啊?多谢
空间积分0 信誉积分2318 UID阅读权限90积分43486帖子精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
富甲一方, 积分 43486, 距离下一级还需 6514 积分
帖子主题精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
论坛徽章:24
gguxxing008
你试着 ldd ./auto/DBD/Oracle.so 看看它是不是有找不到 lib.
如果你发现我的回复跟你说的不是一回事, 那么, 偶是来抬杠的. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
如果你发现我的回复正好是你想知道的, 那么, 是俺蒙对了. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
空间积分0 信誉积分357 UID阅读权限50积分3420帖子精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
小富即安, 积分 3420, 距离下一级还需 1580 积分
帖子主题精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
论坛徽章:1
& & 能找到,有好几个,一开始提示没权限执行./Oracle.so,后来我给整个目录777的权限,没这个提示错误了,但执行这个perl还是报那个错
空间积分0 信誉积分2318 UID阅读权限90积分43486帖子精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
富甲一方, 积分 43486, 距离下一级还需 6514 积分
帖子主题精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
论坛徽章:24
gguxxing008
每一个都能找到? 还是有 not found 的?
如果你发现我的回复跟你说的不是一回事, 那么, 偶是来抬杠的. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
如果你发现我的回复正好是你想知道的, 那么, 是俺蒙对了. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
空间积分0 信誉积分357 UID阅读权限50积分3420帖子精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
小富即安, 积分 3420, 距离下一级还需 1580 积分
帖子主题精华可用积分3420 专家积分0 在线时间361 小时注册时间最后登录
论坛徽章:1
& & 不好意思,开会来晚了,ldd全部都找到了,没有发现有not found的!
空间积分0 信誉积分2318 UID阅读权限90积分43486帖子精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
富甲一方, 积分 43486, 距离下一级还需 6514 积分
帖子主题精华可用积分48789 专家积分0 在线时间4913 小时注册时间最后登录
论坛徽章:24
gguxxing008
那你要看一下这个 DBD::Oracle 是哪里来的了. 或者你比较一下两台机器上的版本吧.
如果你发现我的回复跟你说的不是一回事, 那么, 偶是来抬杠的. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
如果你发现我的回复正好是你想知道的, 那么, 是俺蒙对了. screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onmouseover="if(this.width>screen.width*0.7) {this.resized= this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {} else {window.open(this.src);}" onmousewheel="return imgzoom(this);" alt="" />
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处1249人阅读
作用:用来查看程式运行所需的共 享库,常 用来解决程式因缺少某个库文件而不能运行的一些问题。
ldd命令原理
1、首先ldd不是个可执行程式,而只是个shell脚本
2、ldd能够显示可 执行模块的dependency,其 原理是通过设置一系列的环境变量,如下:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_BIND_NOW、LD_LIBRARY_VERSION、LD_VERBOSE等。当LD_TRACE_LOADED_OBJECTS环境变量不为 空时,所有可执行程式在运行时,他都会只显示模块的dependency, 而程式并不真正执行。要不你能在shell终端测试一 下,如下:
(1) export LD_TRACE_LOADED_OBJECTS=1
(2)&再执行所有的程式,如ls等,看看程式的运行结果
3、ldd显示可执行模块的dependency的 工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道,ld-linux.so模块会先于executable模块程式工 作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示 可执行模块的dependency。
4、实际上能直接执行ld-linux.so模 块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)
ldd命令使用方法(摘自ldd --help)
名称& & ldd -&打印共享库的 依赖关系
大纲& & ldd [选项]... 文件...
描述& &&ldd&输 出在命令行上指定的每个程式或共享库需要的共享库。
&--version
        打印ldd的版本号
&-v --verbose
        打印所有信息,例如包括符号的版本信息
&-d --data-relocs
       执行符号重部署,并报告缺少的目标对象(只对ELF格式适用)
&-r --function-relocs
        对目标对象和函数执行重新部署,并报告缺少的目标对象和函数(只对ELF格式适用)
&--help&用法信息
&ldd的标准版本和glibc2一起提供。Libc5和老版本以前提供,在一些系统中还存在。在libc5版本中长选项不支持。另一方面,glibc2版本不支持-V选项,只提供等价的--version选项。
&如果命令行中给定的库名字包含’/’,这个程式的libc5版本将使用他作为库名字;否则他将在标准位置搜索 库。运行一个当前目录下的共享库,加前缀&./&。
&ldd不能工作在a.out格式的共享库上。
&ldd不能工作在一些非常老的a.out程式上,这些程式在支持ldd的编译器发行前已创建。如果你在这种类型的程式上使 用ldd,程式将尝试argc = 0的运行方式, 其结果不可预知。
今天在编译一个小项目的时候碰到这个问题了,顺便看了一下ldd这东西。
先说说我遇到的问题,这几天一直在编译一个小模块的代码,但是编译的时候需要一部分动态库。折腾了近2天,好不容易东拼西凑的勉强能够编译通过生成文件,但是最后运行的时候冒出来一句“symbol lookup error: undefined symbol:&g_malloc0_n”。
这下把我搞火了,好不容易两天时间才能够编译出来的东西竟然还不能运行,这东西太不给面子了。
没办法,只有百度了。百度倒是挺给力的,直接说可能是我的glib版本有问题,想想也是有些道理的。因为我系统里面的glib东西不是很全,所以自己编译了一份glib库,竟没想到一波未平,一波又起啊,无奈之下只好请教高人了。
高人就是高人,到我这里一看人家就知道是啥问题了,直接一个ldd命令下去,问题一目了然。我编译的时候调用的是自己编译好的glib库文件,主要在/usr/lib目录下,但是实际程序运行的时候我却调用模块自身项目目录下的lib目录下的库,也就是./lib目录。很明显,两边调用的库不一样,所以人家自然也就不认了。
于是设置一下LD_LIBRARY_PATH来修改连接库,搞定了。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:71862次
积分:1228
积分:1228
排名:第15575名
原创:46篇
评论:21条
(4)(2)(1)(4)(2)(1)(2)(32)(1)(1)(2)(1)(1)(1)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分100 UID阅读权限10积分1帖子精华可用积分1 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 1, 距离下一级还需 199 积分
帖子主题精华可用积分1 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
perl 5.10.0
本地编译的时候报这个错,google了半天还是一头雾水,有人能稍微给点思路吗,谢谢。
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分147 UID阅读权限20积分422帖子精华可用积分422 专家积分0 在线时间1158 小时注册时间最后登录
稍有积蓄, 积分 422, 距离下一级还需 78 积分
帖子主题精华可用积分422 专家积分0 在线时间1158 小时注册时间最后登录
论坛徽章:0
imanewbird21
& & 连代码都不贴的吗?无语
空间积分0 信誉积分104 UID8991416阅读权限10积分4帖子精华可用积分4 专家积分0 在线时间0 小时注册时间最后登录
白手起家, 积分 4, 距离下一级还需 196 积分
帖子主题精华可用积分4 专家积分0 在线时间0 小时注册时间最后登录
论坛徽章:0
很可能是程序自带了Perl,而且和本机的Perl版本不一致,可以看一下这里:解决
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 undefined symbol 的文章

 

随机推荐