2012-08-14 278 views
5

当执行一个第三方的C++程序中,我得到以下错误:错误:libgomp.so.1:,错误的GCC版本?

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

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

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

或者我需要安装另一个软件包吗?

我试图通过下载库并将其放在LD_LIBRARY_PATH上手动修复此问题,但后来我又找到另一个缺失的库:/usr/lib/libstdc++.so.6:version`GLIBCXX_3 .4.11'找不到。 libstdc是GNU标准C++库,所以这也表明了GCC的错误版本?

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

os是linux 64位。

GCC-4.3机:openSUSE的11.1

GCC-4.5机:openSUSE的11.4(本机上的程序作品)

GCC-4.6机:openSUSE的12.1

+0

我假定在那个系统上有linux。什么是实际分配? – unkulunkulu 2012-08-14 09:31:48

+0

程序是否也是64位的? – 2012-08-14 09:54:32

回答

3

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

  1. 获取应用程序的源代码,并自己编译它为您的系统,
  2. 获取对GCC的较新版本编译的应用程序的另一个版本,
  3. 获取静态该应用程序的链接版本,
  4. 如果你的发行支持,安装在平行libgomp的旧版本,
  5. 如果没有,你仍然可以抓住老libgomp二进制并把它放在你的/usr/lib(最好, /usr/local/lib代替,如果该路径在/etc/ld.so.conf),
  6. 最后,如果可能的话,可以将gcc降级到旧版本以使其工作。但这是一个糟糕的短时间解决方案。
1

似乎对程序的编译并使用gcc-4.5进行链接,这意味着您将头痛地移植到4.5之前的版本。发行版中的依赖关系(假设Linux)不容易转移到核心库的下一个主要版本,如clib和C++ lib。将gcc-4.3包装箱的标准升级到下一个Linux发布版本要容易得多。

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

可能有工具提取您的对话框,以便依赖性,请尝试

man ldd

+0

有一些rpm包可以帮助你处理gcc-4.6的情况,例如这个rpm-site有一个页面[rpm.pbone.net ...](http://rpm.pbone.net/index .php3/STAT/3/srodzaj/1 /搜索/ libgomp.so.1()(64位))。 (或者可能会造成麻烦) – Jojje 2012-08-14 10:59:29

2

您可以通过使用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=...后,看它是否解决库预期。