【undefined reference to xxx】zookeeper库编译和安装 / sylar项目ubuntu2 ...

半亩花草  论坛元老 | 2024-10-27 11:28:43 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1744|帖子 1744|积分 5232

最近学习sylar项目,编译项目时遇到链接库不匹配的问题,记录下自己解决问题过程,虽然过程很艰巨,但照旧解决了,以下内容供大家参考!
  undefined reference to ``问题分析



  • 项目编译报错
    1. /usr/bin/ld: ../lib/libsylar.so: undefined reference to `ZOO_READONLY_STATE'
    2. /usr/bin/ld: ../lib/libsylar.so: undefined reference to `zookeeper_init2'
    3. /usr/bin/ld: ../lib/libsylar.so: undefined reference to `zoo_set_servers'
    4. /usr/bin/ld: ../lib/libsylar.so: undefined reference to `ZOO_NOTCONNECTED_STATE'
    5. /usr/bin/ld: ../lib/libsylar.so: undefined reference to `zoo_get_current_server'
    6. /usr/bin/ld: ../lib/libsylar.so: undefined reference to `ZOO_CONTAINER'
    复制代码
  • 应该是链接到的库文件中不含这些字符,因为之前是sudo apt-get install libzookeeper-dev安装的,版本较久(3.4.13),我也看了它的头文件源码,确实没有这些定义变量和函数;(注意这里的我看的是zookeeper.h头文件,而libzookeeper_mt.so文件是安装编译时产生的,因此两个文件内容是一致的;下面讲下怎样通过二进制文件libzookeeper_mt.so来查看是否包含某种字符)
  • 查看验证libzookeeper_mt.so链接文件是否包含对应的字符

    • find / -name libzookeeper_mt.so 在/usr/lib/libzookeeper_mt.so
      定位找到了链接文件;
    • nm -D libzookeeper_mt.so | grep ZOO_READONLY_STATE
      查看这个二进制文件中的可显示字符是否有报错的字符,发现并没有,可以确定当前系统安装库的zookeeper版本简直没有对应变量和函数定义,那么就需要安装新的版本库;

编译安装zookeeper

   我之前通过apt安装的,并且查看了下里面源库中没有更新的版本,因此只能下载库安装包,手动编译安装;
zookeeper下载地址 https://dlcdn.apache.org/zookeeper/
  

  • 下载安装包后,可以查看README_packaging.md,里面具体讲解了怎样构建和安装这个库,并且指出最终天生的链接文件路径;具体操作如下:

    • 依赖软件包安装命令
      RHEL系统:
    1. yum install cppunit
    2. yum install python-setuptools
    3. yum install openssl openssl-devel
    4. yum install cyrus-sasl-md5 cyrus-sasl-gssapi cyrus-sasl-devel
    复制代码
    1.   Ubuntu系统(适用于 16.04+):
    复制代码
    1. apt-get install libcppunit-dev
    2. apt-get install python-setuptools python2.7-dev
    3. apt-get install openssl libssl-dev
    4. apt-get install libsasl2-modules-gssapi-mit libsasl2-modules libsasl2-dev
    复制代码
      

    • 使用 Maven (没有指令的话需要安装)构建包:以下命令将清算所有内容并构建 tarball 包,同时跳过测试:
    1. mvn clean install -DskipTests
    复制代码
      

    • 构建 C 客户端,需要激活 full-build 设置文件:
    1. mvn clean -Pfull-build
    2. mvn install -Pfull-build -DskipTests
    复制代码
      

    • 编译后文件位置
    1.   - 用户可执行文件在 `zookeeper-client/zookeeper-client-c/target/c/bin`。
    2.   - 原生库在 `zookeeper-client/zookeeper-client-c/target/c/lib`。                // 我们所需的链接文件路径
    3.   - 原生库头文件在 `zookeeper-client/zookeeper-client-c/target/c/include/zookeeper`。
    复制代码

  • 如果构建安装顺遂的话,就可以看到乐成显示;

  • 下述就是需要的链接文件,然后将对应的文件复制到/usr/lib/ 或者 /usr/local/lib/下,包管系统编译器可以找到;

  • 构建时如果报错,比方需要添加JAVA_HOME环境变量,在~/.bashrc文件中添加,自己安装JAVA的jdk路径即可;
    具体操作见:https://blog.csdn.net/weixin_50570038/article/details/143256298

末了查抄下是否乐成


此时发现可以找到ZOO_READONLY_STATE字符变量,完结!!
通过以上操作,可以解决编译项目过程中,遇到链接文件大概由于版本不支持导致无法乐成编译的问题;
反正遇到问题不要怕,一步步分析、解决,这个过程也可以深入理解linux系统下的编译过程(虽然我花了两天才解决这个问题)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表