解决 Net::ZooKeeper找不到动态链接库符号问题

引用Net::ZooKeeper这个包,可能会报这个错误

Can‘t load ‘/usr/local/lib64/perl5/auto/Net/ZooKeeper/ZooKeeper.so‘ for module Net::ZooKeeper: /usr/local/lib64/perl5/auto/Net/ZooKeeper/ZooKeeper.so: undefined symbol: ZOO_PERM_CREATE at /usr/lib64/perl5/XSLoader.pm line 70.
 at /usr/local/lib64/perl5/Net/ZooKeeper.pm line 109.

查看XSLoader.pm的70行:

 70     my $libref = dl_load_file($file, 0) or do {
 71         require Carp;
 72         Carp::croak("Can‘t load ‘$file‘ for module $module: " . dl_error());
 73     };

实际上是加载ZooKeeper.so这个动态链接库。我们objdump,看看这个缺少的符号到底有没有在这个链接库里面。

[[email protected] xoa2-perl]$ objdump -x /usr/local/lib64/perl5/auto/Net/ZooKeeper/ZooKeeper.so | grep ZOO
0000000000000000         *UND*  0000000000000000              ZOO_PERM_CREATE
0000000000000000         *UND*  0000000000000000              ZOO_READ_ACL_UNSAFE
0000000000000000         *UND*  0000000000000000              ZOO_PERM_WRITE
0000000000000000         *UND*  0000000000000000              ZOO_ASSOCIATING_STATE
0000000000000000         *UND*  0000000000000000              ZOO_CREATED_EVENT
0000000000000000         *UND*  0000000000000000              ZOO_CONNECTED_STATE
0000000000000000         *UND*  0000000000000000              ZOO_AUTH_FAILED_STATE
0000000000000000         *UND*  0000000000000000              ZOO_EPHEMERAL
0000000000000000         *UND*  0000000000000000              ZOO_SEQUENCE
0000000000000000         *UND*  0000000000000000              ZOO_PERM_READ
0000000000000000         *UND*  0000000000000000              ZOO_CREATOR_ALL_ACL
0000000000000000         *UND*  0000000000000000              ZOO_PERM_ALL
0000000000000000         *UND*  0000000000000000              ZOO_DELETED_EVENT
0000000000000000         *UND*  0000000000000000              ZOO_OPEN_ACL_UNSAFE
0000000000000000         *UND*  0000000000000000              ZOO_PERM_ADMIN
0000000000000000         *UND*  0000000000000000              ZOO_CONNECTING_STATE
0000000000000000         *UND*  0000000000000000              ZOO_EXPIRED_SESSION_STATE
0000000000000000         *UND*  0000000000000000              ZOO_NOTWATCHING_EVENT
0000000000000000         *UND*  0000000000000000              ZOO_PERM_DELETE
0000000000000000         *UND*  0000000000000000              ZOO_CHANGED_EVENT
0000000000000000         *UND*  0000000000000000              ZOO_CHILD_EVENT
0000000000000000         *UND*  0000000000000000              ZOO_SESSION_EVENT

标记为UND,说明这是一个外部符号,应该是需要引用其他库,估计是zookeeper库。但是lib包已经加入了LD_LIBRARY_PATH,非常奇怪。

尝试重新编译ZooKeeper.so(源码在zookeeper的contrib/zkperl下),发现发布包是用MakeMaker组织的,首先生成Makefile,获得下面的提示:

[[email protected] zkperl]$ perl Makefile.PL 
Warning (mostly harmless): No library found for -lzookeeper_mt
Generating a Unix-style Makefile
Writing Makefile for Net::ZooKeeper
Writing MYMETA.yml and MYMETA.json

注意第一行的warning,这是解决问题的关键。Most harmless,but harm this time。查看 Makefile.PL的 第31行

 31 GetOptions(
 32     ‘zookeeper-include=s‘ => \@zk_inc_paths,
 33     ‘zookeeper-lib=s‘ => \@zk_lib_paths
 34 );

可见第二个选项是必须的。

重新编译。

[[email protected] zkperl]$ perl Makefile.PL --zookeeper-lib=/home/zhangbin/env/lib
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Net::ZooKeeper
Writing MYMETA.yml and MYMETA.json

然后make && sudo make install。问题解决。

可能XSLoader没有自动从LD_LIBRARY_PATH寻找可用的库和符号表的机制。

时间: 2025-01-14 00:19:41

解决 Net::ZooKeeper找不到动态链接库符号问题的相关文章

linux找不到动态链接库 .so文件的解决方法

如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时可能会出现找不到动态链接库的情形. 可以通过ldd命名来查看可执行文件依赖的动态链接库,如下(其中D为可执行程序): 其中的libjson_linux-gcc-4.6_libmt.so cannot found. 解决这个问题: (1)在系统中查找这个文件(当然要保证系统中已经有这个.so文件,只是查找路径没有设置正确而已): sudo find / -name libjson_linux-gcc

解决 .bashrc: 行 1: 未预期的符号 `(' 附近有语法错误

平台:ubuntu12.04 现象:shell终端错误提示如下 .bashrc: 行 1: 未预期的符号 `(' 附近有语法错误 .bashrc: 行 1: `# ~/.bashrc: executed by bash(1) for non-login shells.' 解决:将.bashrc文件的编码格式改为UTF-8即可! 方法:(1) 将.bashrc拷贝到Windows (2)将.bashrc改为.bashrc.txt (3)打开,另存为时将编码改为UTF-8,保存即可! (4)将.ba

都市白领租房APP定制解决了哪些找房的痛点

现在的都市白领主要是以租房为主,传统找房子存在很多的痛点,要么是朋友介绍,要么就是自己去找.自己找的话,需要专门空一天时间来找,一般都是很盲目地去找的,在想住的地区看到有挂着房东电话号码以及粗略的住房信息的牌子,然后打电话过去咨询,有合适的再去看房,没合适的就接着打下一个电话,这是找城中村房子的方式.还有一种是找小区房子,一般不会在外贴住房信息的,你需要找到房地产中介,让中介帮你找,找到后要给中介付房租一般的中介费用,想想都肉疼.但是互联网APP出现之后,找房子直接线上找,下载一个租房APP就可

eclipse-java-2018-09-win32-x86_64配置tomcat(内含更新eclipse,如何解决添加时找不到最新tomcat版本)

我下的是eclipse精简版,建议下载企业版,可以省略后面的很多步骤(其中的辛酸...) 这里就是说明下载精简版的eclipse如何配置tomcat的步骤,其实还是更新eclipse的步骤 1.首先点击windows中的preferences 2.打开preferences中的server 3.打开runtime environment 4.我下载的是tomcat8.5所以选择tomcat8.5,然后点击finish,tomcat已经配置到eclipse中了,打开eclipse可以创建web工程

解决 IDA 加载 ntoskrnl.exe 时符号不完全问题

解决 IDA 加载 ntoskrnl.exe 时符号不完全问题 1. 问题:IDA加载xp系统的 ntoskrnl.exe 加载不完全. 2. 尝试过但未成功的解决方案: 1)配置好的IDA的 pdb.cfg,依然无效. 2)清空 C:\\symbol\ 文件下的符号表重新打开,期望符号表会重新下载. 3. 解决方案: 1)使用工具 IDA7.0 64位 吾爱免安装版(32位时加载pdb文件出现错误) 2)PDBDownloader.exe 软件,将 ntoskrnl.exe 文件拖拽进去,点击

Eclipse的PyDev插件安装及解决安装后找不到的问题

一.环境 windows 7 64bit eclipse 4.5.2 pydev jdk7u55 二.安装步骤 1. 安装JDK eclipse依赖于Java环境,所以需要安装Java运行环境JRE.由于JDK既包含了JRE,又可以用来做开发.直接下载jdk安装.我安装的是JDK 7. 地址:http://www.java.com/zh_CN/download/ 具体安装jdk的教程,请自行百度. 2. 安装eclipse eclipse下载地址在这里:http://www.eclipse.or

巧妙解决Win10专业版找不到无线网络设置的办法

Win10专业版下找不到无线网络设置的具体解决技巧由系统天地官网率先分享!第一步.打开控制面板,找到网络和internet,如图所示:第二步.点击网络和共享中心→设置新的连接或网络,如图所示:第三步.点击连接到internet→下一步→是,选择现有的连接→下一步,如图所示:第四步.然后在炸金花界面中,点击飞行模式,将飞行模式关闭,打开无线设备即可,如图所示:以上就是Win10专业版找到不到无线网络设置的解决方法,有出现这情况的用户可以参考文中方法进行修复,希望今天的分享对大家有所帮助.

Activiti系列:如何把Activiti工程转换为maven工程以解决依赖项找不到的问题

在eclipse中安装了Activiti插件之后,就可以新建Activiti工程,但是在实际使用时发现,在该工程中间新建Activiti Diagram,绘制好该图形之后,右键,新建单元测试,选择junit4类型, 1. 创建Activiti工程 2. 新建Activiti Diagram 3. 绘制如下流程 4. 创建该bpmn图形的单元测试 5. 然后单元测试代码就报如下的各种找不到类型的错误 6. 如果是maven的项目,一般可以通过如下方式解决 7. 但是在Activiti类型的工程中,

typescript的lambads解决this关键字找不到属性

var people = { name: ["abc", "jack", "pepter", "jim"], getname: function() { return function () { var i = Math.floor((Math.random() * 4)); return { n: this.name[i] }; }; } }; var myName = people.getname(); alert(&qu