【问题标题】:CRYPTO_num_locks error occurs due to two versions of libcurl on Centos 7由于 Centos 7 上有两个版本的 libcurl 导致 CRYPTO_num_locks 错误
【发布时间】:2019-08-20 21:58:02
【问题描述】:

我正在尝试在虚拟 Centos 7 发行版上构建一些 c++ 库。 由于我还没有发现这个操作系统无法像其他 linux 发行版那样看到这些库安装的 /usr/local/lib 或 /usr/local/lib64 的原因。所以我不得不在/etc/ld.so.conf 中添加这些文件夹。然后 c++ 链接器能够看到这些库。 然而,当我后来给了

 sudo yum update

我收到以下消息:

/usr/lib64/python2.7/site-packages/pycurl.so:未定义符号:CRYPTO_num_locks

查了一下发现是因为libcurl有两个版本导致的。我给了

ldconfig -v | grep libcurl

我得到了以下信息:

ldconfig: Path `/usr/lib' given more than once
ldconfig: Path `/usr/lib64' given more than once
libcurl.so.4 -> libcurl.so.4.4.0
libcurl.so.4 -> libcurl.so.4.3.0

意思是我安装了一个新版本的libcurl,现在两个版本并存。 当我从 /etc/ld.so.conf 中删除文件夹路径时,yum 工作正常,但 c++ 链接器找不到我的应用程序需要的 c++ 库。我也尝试更新 LD_LIBRARY_PATH 但我遇到了同样的问题。
有没有办法解决这个问题而无需在新位置重新安装库?删除旧版本是否安全?

ls -lsa /usr/lib64/*curl*给了

 0 lrwxrwxrwx. 1 root root 16 Aug 10 10:19 /usr/lib64/libcurl.so.4 -> libcurl.so.4.3.0  

 428 -rwxr-xr-x. 1 root root 435120 Nov 14 2016 /usr/lib64/libcurl.so.4.3.0 

我尝试给予

sudo unlink /usr/lib64/libcurl.so.4 
sudo ln -s /usr/local/lib/libcurl.so.4.4.0 /usr/lib64/libcurl.so.4 

我什至将它们作为 root 用户,但每次我给予 ldconfig 我都会得到

   libcurl.so.4 -> libcurl.so.4.3.0 

在 ldconfig 给出之前

  libcurl.so.4 -> /usr/local/lib/libcurl.so.4.4.0

【问题讨论】:

    标签: centos libcurl yum


    【解决方案1】:

    我遇到了同样的问题,但我的系统上没有安装两个版本的 curl 或 pycurl。我安装了一个最终用户软件,更改了 LD_LIBRARY_PATH,但它不包括 /usr/lib 或 /usr/lib64。我尝试将它们添加到路径的末尾,但仍然收到相同的错误。我将它们添加到前面,并且没有更多错误。我必须询问我的最终用户是否有正当理由从环境变量中排除默认库。

    【讨论】:

      【解决方案2】:

      据我所知,CentOS 上标准库的默认路径是 /usr/lib 和 /usr/lib64。如果从源代码编译,在使用 ./configure 时没有明确指定库路径,这些库将默认安装在 /usr/local/lib 或 /usr/local/lib64 中(通常 lib64 在 64 位操作系统上找到) .因此,如果那里安装了库,您应该在 /etc/ld.so.conf 中添加这些路径,然后运行ldconfig

      根据你的例子:

      ldconfig: Path `/usr/lib' given more than once
      ldconfig: Path `/usr/lib64' given more than once
      libcurl.so.4 -> libcurl.so.4.4.0
      libcurl.so.4 -> libcurl.so.4.3.0
      

      libcurl.so.4 链接到 2 个不同的库版本,我认为这是您的问题的原因。

      您可以删除第二个链接libcurl.so.4 -> libcurl.so.4.3.0,让 libcurl.so.4 仅链接到 libcurl.so.4.4.0,运行 ldconfig 并重试.

      【讨论】:

      • 感谢您的帮助。每次我删除驻留在 /usr/lib64 中的 libcurl.so.4(使用 sudo rm)时,ldconfig 的运行都会重新创建它。有没有特定的方法可以删除这种链接?
      • 尝试使用unlink /path/to/libcurl.so.4,然后使用所需库创建一个新链接
      • 做一个ls -lsa /usr/lib64/*curl* 并检查那里的所有链接,并确保你链接的东西是正确的
      • 你能正确编辑评论和格式化文本吗?有点难跟上
      • 检查 /usr/local/lib/ /usr/local/lib64 并查看是否有任何其他符号链接指向该 4.3.0 版本。应该有另一个链接指向某个地方
      猜你喜欢
      • 2016-01-24
      • 2014-08-04
      • 2012-12-31
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多