【问题标题】:How to fix: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found如何修复:/usr/lib/libstdc++.so.6:找不到版本“GLIBCXX_3.4.15”
【发布时间】:2013-10-15 16:48:07
【问题描述】:

所以我现在迫切希望找到解决此问题的方法。我正在 Ubuntu 32 位中编译一个共享库 .so (尝试在 Debian 和 Ubuntu 64 位下进行,但也没有工作)

每次尝试加载我的插件时,我都会收到:/usr/lib/libstdc++.so.6: version ``GLIBCXX_3.4.15' not found

这是我收到此错误的原因:

  1. 安装最新的 Ubuntu 32 位
  2. sudo apt-get install build-essential
  3. 编译并加载我的插件 (.so)

以下是我找到并尝试过的一些链接,但没有一个对我有用:

(我的老问题:我在发布此问题几天后以某种方式修复了它,但我不记得我是如何做到的)

My Question

Another user with the same problem

And another

我看到有些人通过将 libstdc++(我认为)移动到某个目录然后将 idk what 指向或链接到该目录来修复它,但这让我感到困惑。

有人知道解决办法吗?

(编辑:) - 在终端中运行:strings /usr/lib/libstdc++.so.6 | grep GLIBC 给我:strings '/usr/lib/libstdc++.so.6': No such file。这可能是问题吗?如果是这样,我该如何安装这个库?

(Edit2:) 其他人知道解决方案吗?

(Edit3) 仍然需要解决方案。有没有办法查看共享库是在哪个发行版上编译的?我知道我不久前曾经编译过同一个库,但不记得了!!

(Edit4)ldd my_lib_.so 给我:

    linux-gate.so.1 =>  (0xb77d7000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76c1000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb76a4000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fa000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74ce000)
    /lib/ld-linux.so.2 (0xb77d8000)

ldd program_im_loading_so_into 给我:

    linux-gate.so.1 =>  (0xb77d8000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb77c0000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb77a5000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76bb000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb768f000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7672000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74c9000)
    /lib/ld-linux.so.2 (0xb77d9000)

运行strings /usr/lib/i386-linux-gnu/libstdc++.so.6 | grep GLIBCXX 给了我:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

最后这是我的 gcc 版本:

`gcc version 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04)`

【问题讨论】:

  • 如果你对你的库运行“nm”,它是否显示对 GLIBC3.4.15 的任何依赖关系?您是否尝试安装使用旧 glibc 版本构建的旧 libstdc++?
  • 嘿,我在运行 nm 时得到了这个:U_ZNSt8__detail15_List_node_base7_M_hookEPS0_@@GLIBCXX_3.4.15 U _ZNSt8__detail15_List_node_base9_M_unhookEv@@GLIBCXX_3.4.15,我刚刚安装了所有以 6.x.x 结尾的库(在 ubuntu 应用程序管理器中找到),甚至安装了 libstdc++5,但是它仍然无法正常工作。不断出现同样的错误
  • 也许你在不寻常的目录中有一些额外的 libstdc++ 副本?在 debian 上,您应该将它放在 /usr/lib/i386-linux-gnu
  • 嗨。我运行locate libstdc++.so.6 并得到以下信息:/usr/lib/i386-linux-gnu/libstdc++.so.6/usr/lib/i386-linux-gnu/libstdc++.so.6.0.18。我猜这意味着异常目录中没有任何其他 libstdc++?
  • 您是否将您的插件与一些在别处编译的目标文件链接?此外,您是否在尝试加载插件之前以任何方式修改环境?您确定您使用相同的编译器来编译插件和加载它的程序吗? LD_DEBUG=all program_im_loading_so_into 的输出是什么?

标签: c++ linux


【解决方案1】:

使用-static-libstdc++ gcc 选项静态链接到 libstdc++。

【讨论】:

  • 除了增加二进制文件的大小之外,还有其他缺点吗?也许您的二进制文件不会从未来的安全更新中受益。还有什么?
  • @DrewNoakes:你可以看看stackoverflow.com/questions/13636513/…
  • 为什么这是必要的?如果 gcc 可以用特定版本的 libstdc++ 编译,为什么程序不能在同一台机器上使用该版本运行?
【解决方案2】:

我通过安装解决了这个问题:sudo apt-get install libstdc++6

就我而言,我在安装 MongoDB 3.0.1 后遇到了这个问题

mongo:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:找不到版本“GLIBCXX_3.4.18”(mongo 需要)

【讨论】:

    【解决方案3】:

    只需从非默认存储库安装最新版本:

    $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    $ sudo apt-get update
    $ sudo apt-get install libstdc++6-4.7-dev
    

    【讨论】:

    • $ add-apt-repository ... 找不到命令(??!!也在 Ubuntui (12.04) 上)
    • 安装 python-software-properties 你会得到add-apt-repository: $ sudo apt-get install software-properties-common python-software-properties ubuntuforums.org/showthread.php?t=1971357
    【解决方案4】:

    这个问题可以通过安装最新的libstdc++来解决。

    $ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
    $ sudo apt-get update
    $ sudo apt-get install libstdc++6-7-dbg
    

    【讨论】:

      【解决方案5】:

      在上面,您提到将编译作为重现步骤的一部分,但在下面您进行了编辑,说,

      “有没有办法查看共享库是在哪个发行版上编译的?”

      无论您是否在同一个发行版上编译它,甚至同一个发行版的不同版本都是一个重要的细节,尤其是对于 c++ 应用程序。

      据我所知,链接到 c++ 库(包括 libstdc++)可能会产生不同的结果。这是一个有关使用不同版本的 c++ 重新编译的相关问题。

      do we need to recompile libraries with c++11?

      基本上,如果您在不同的发行版(可能还有不同的 gcc 版本)上针对 c++ 进行编译,这可能会给您带来麻烦。

      我认为你有两个选择:

      1. 您最好的选择 - 如果您尚未在当前系统上编译它,请重新编译您的 .so。如果你的运行时系统环境有问题,它甚至可能在编译时出现。
      2. 将您的其他编译器的 c++ 库与您的应用程序捆绑在一起。这可能只有在相同的发行版中才可行……但是如果您使用自己的编译器,这将是一个有用的技巧。如果您走这条路线,您还必须设置并导出 LD_LIBRARY_PATH 到包含捆绑的 stdc++ 库的路径。

      【讨论】:

        【解决方案6】:

        如果有人遇到与我相同的问题 - 确保您没有从 Ubuntu 14.04 存储库安装到 12.04 机器上 - 它会给出同样的错误。从正确的存储库重新安装解决了这个问题。

        【讨论】:

        • 我正在并行使用多台机器,但没有意识到其中一台仍在 14.04 上,而其他机器在 15.10 上。导致了同样的问题。谢谢。
        【解决方案7】:

        也许这个问题的答案在这里也有用: how to find libstdc++.so.6: that contain GLIBCXX_3.4.19 for RHEL 6?

        curl -O http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc++6-4.7-dbg_4.7.2-5_i386.deb
        ar -x libstdc++6-4.7-dbg_4.7.2-5_i386.deb && tar xvf data.tar.gz
        mkdir backup
        cp /usr/lib/libstdc++.so* backup/
        cp ./usr/lib/i386-linux-gnu/debug/libstdc++.so.6.0.17 /usr/lib
        ln -s libstdc++.so.6.0.17 libstdc++.so.6
        

        【讨论】:

          【解决方案8】:

          这对我有用:

          cp <path_to>/libstdc++.so.6 $PWD
          ./<executable>
          

          这个花絮来自@kerin(上面提供的评论):

          您可以查看http://stackoverflow.com/questions/13636513/linking-libstdc-statically-any-gotchas

          从那个链接:

          如果您将较新的 libstdc++.so 放在与可执行文件相同的目录中,它将在运行时找到,问题就解决了。

          我被提到的错误是 libstdc++.so.6 来自 /usr/lib64/,但这不是我链接的库!消息看起来像:

          <executing_binary>: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by <executing_binary>)
          

          我确实验证了 LD_LIBRARY_PATH 有目录(并且它是第一个路径)。由于某种原因,它在运行时仍在查看 /usr/lib64/libstdc++.so.6。

          我从上面的文章中得到建议,并将 libstdc++.so.6 从我链接到我的可执行文件的目录中复制,从那里运行,它工作了!

          【讨论】:

            【解决方案9】:

            其实,你需要先更新你的 repo,然后升级你的 Glibc 才能解决这个问题。

            【讨论】:

              猜你喜欢
              • 2011-07-10
              • 2015-10-10
              • 1970-01-01
              • 1970-01-01
              • 2017-12-27
              • 2022-10-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多