添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱玩的小熊猫  ·  Let’s Encrypt ...·  1 年前    · 

While executing a 3rd party c++ program I get the following error:

error while loading shared libraries: libgomp.so.1: cannot open shared object file: No such file or directory

The libgomp.so.1 library is the GNU compiler collection OpenMP runtime library.

Is this part of the GCC package? I can run the program on a system with gcc-4.5, but not system with gcc-4.3 or gcc-4.6.

Or do I need to install another package?

I tried to fix this manually on the system with gcc-4.3 by downloading the library and putting it on the LD_LIBRARY_PATH, but then I get another missing library : /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found . libstdc is the GNU Standard C++ library so this also indicates a wrong version of GCC?

I am not a C++ developer so I don't fully know what these libraries are and how libraries work in general with C++ code.

The os is linux 64 bit.

gcc-4.3 machine : openSUSE 11.1

gcc-4.5 machine : openSUSE 11.4 (on this machine the program works)

gcc-4.6 machine : openSUSE 12.1

The program was linked against a specific version of libgomp ( libgomp.so.1 ) and it can only be used by that one. So you have to either:

  • Obtain the source code of the application and compile it yourself for your system,
  • Obtain an another version of the application compiled against newer version of gcc,
  • Obtain a statically linked version of the application,
  • If your distribution supports that, install the older version of libgomp in parallel,
  • If it doesn't, you can still grab the older libgomp binary and put it in your /usr/lib (preferably, /usr/local/lib instead if that path is in your /etc/ld.so.conf ),
  • And finally, if that's possible you can downgrade gcc to the older version to make it work. But it's a bad, short-time solution.
  • You can see all the shared library linked dependencies of a program by using comamnd ldd . For example:

    $ 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)
    

    Now, if you want to run this program in another machine and have problems with the version of the shared libraries you can try copying the lot to a directory and then use the LD_LIBRARY_PATH trick. But note that some libraries must not be copied:

  • linux-gate.so: Not a real file, but a gateway to kernel land.
  • /lib/ld-linux-so.2: The dynamic loader, (or ELF interpreter, as some call it). There is a static reference to it in the header of every dynamically linked executable. Do not copy it.
  • [/usr]/lib/i386-linux-gnu/*: Everything in this directory is architecture specific. It may work if both machines have the same architecture. If not, you have to look for a library with the same name under [/usr]/lib/<your-real-arch>/*.
  • In the target machine, you can also use the ldd tool after export LD_LIBRARY_PATH=... to see if it is resolving the libraries as expected.

    Seems your program was compiled and linked using gcc-4.5, that then implies you will have a headache porting it to versions prior to 4.5. The dependencies within a distro (assuming Linux) are not easily brought forward to next major versions of the core libs like clib and c++lib. Much much easier to do a standard upgrade of your gcc-4.3 box to next Linux-distro release.

    For the gcc-4.6 machine you might need to search for a compat package containing libgomp.so.1. this is distro dependent and I don't know the details here.

    There might be tools for extracting so-dependency info on your box, try

    man ldd

    There are rpm-packages out there that may help you with the gcc-4.6 case, for instance this rpm-site has a page rpm.pbone.net.... (Or may cause trouble) – Jojje Aug 14 '12 at 10:59

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.

    site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.2.15.36073