2012-08-14 239 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=...後,看它是否解決庫預期。