7

在执行第 3 方 c++ 程序时,出现以下错误:

加载共享库时出错:libgomp.so.1:无法打开共享对象文件:没有这样的文件或目录

libgomp.so.1 库是 GNU 编译器集合 OpenMP 运行时库。

这是 GCC 包的一部分吗?我可以在带有 gcc-4.5 的系统上运行该程序,但不能在带有 gcc-4.3 或 gcc-4.6 的系统上运行。

还是我需要安装另一个包?

我尝试通过下载库并将其放在 LD_LIBRARY_PATH 上使用 gcc-4.3 在系统上手动修复此问题,但后来我得到另一个丢失的库:/usr/lib/libstdc++.so.6: 版本 `GLIBCXX_3.4.11' 不是成立 。libstdc 是 GNU 标准 C++ 库,所以这也表明 GCC 版本错误?

我不是 C++ 开发人员,所以我不完全了解这些库是什么以及库通常如何与 C++ 代码一起工作。

操作系统是 linux 64 位。

gcc-4.3 机器:openSUSE 11.1

gcc-4.5 机器:openSUSE 11.4(在这台机器上程序工作)

gcc-4.6 机器:openSUSE 12.1

4

3 回答 3

3

该程序与特定版本的 libgomp ( libgomp.so.1) 相关联,并且只能由该版本使用。所以你必须:

  1. 获取应用程序的源代码并为您的系统自行编译,
  2. 获取针对较新版本的 gcc 编译的应用程序的另一个版本,
  3. 获取应用程序的静态链接版本,
  4. 如果您的发行版支持,请并行安装旧版本的 libgomp,
  5. 如果没有,您仍然可以获取较旧的 libgomp 二进制文件并将其放入您的/usr/lib(最好是,/usr/local/lib如果该路径在您的/etc/ld.so.conf.
  6. 最后,如果可能的话,您可以将 gcc 降级到旧版本以使其正常工作。但这是一个糟糕的、短期的解决方案。
于 2012-08-14T09:53:11.683 回答
3

您可以使用 comamnd 查看程序的所有共享库链接依赖项ldd。例如:

$ ldd /bin/ls
    linux-gate.so.1 =>  (0xb76fe000)
    libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb76be000)
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb76b5000)
    libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0xb76ab000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7506000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7501000)
    /lib/ld-linux.so.2 (0xb76ff000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb74e6000)
    libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0xb74e0000)

现在,如果你想在另一台机器上运行这个程序并且共享库的版本有问题,你可以尝试将很多复制到一个目录,然后使用这个LD_LIBRARY_PATH技巧。但请注意,某些库不得复制:

  • linux-gate.so: 不是真正的文件,而是通往内核领域的门户。
  • /lib/ld-linux-so.2: 动态加载器,(或 ELF 解释器,有些人称之为)。在每个动态链接的可执行文件的标头中都有对它的静态引用。不要复制它。
  • [/usr]/lib/i386-linux-gnu/*:此目录中的所有内容都是特定于体系结构的。如果两台机器具有相同的架构,它可能会工作。如果没有,则必须在[/usr]/lib/<your-real-arch>/*.

在目标机器中,您还可以使用该ldd工具export LD_LIBRARY_PATH=...查看它是否按预期解析库。

于 2012-08-14T09:52:56.863 回答
1

似乎您的程序是使用 gcc-4.5 编译和链接的,这意味着您将很难将其移植到 4.5 之前的版本。发行版中的依赖项(假设是 Linux)不容易被带到核心库的下一个主要版本,如 clib 和 c++lib。将 gcc-4.3 机器标准升级到下一个 Linux 发行版要容易得多。

对于 gcc-4.6 机器,您可能需要搜索包含 libgomp.so.1 的兼容包。这取决于发行版,我不知道这里的细节。

可能有用于在您的盒子上提取 so-dependency 信息的工具,尝试

人 ldd

于 2012-08-14T09:51:49.753 回答