2017-06-15 110 views
2

我目前正嘗試在SPARC S7服務器上使用Oracle Linux 6 OS來運行NPB基準(支持OpenMP多線程)。操作系統預裝gcc 4.4.7,這是缺少Niagara 7優化。我從Oracle Yum Repository下載了devtoolset-3,其中gcc 4.9.2安裝在/opt/rh/devtoolset-3/root/usr/bin中。但是,當我使用較新的gcc編譯NPB基準測試時,它會自動鏈接到與舊版gcc 4.4.7(位於/usr/lib)關聯的庫。這導致我的程序在執行過程中發生段錯誤。我認爲這是因爲libgomp 4.4.7libgomp 4.9.2不兼容。我已經嘗試了幾種鏈接到gcc 4.9.2文件夾中的庫(這是/opt/rh/devtoolset-3/root/usr/lib/gcc);沒有一種方法工作:如何鏈接來自多個位置的庫(對應於多個GCC版本)?

  1. -Xlinker -rpath=lib_location
  2. -Wl -Bstatic
  3. -L lib_location

我使用-Wl -Bstatic ~/libgomp.a-static -L ~/libgomp.a時是最接近的。它無法找到駐留在默認gcc lib文件夾(usr/lib)中的庫,如libm

用於鏈路的實際命令是:

/opt/rh/devtoolset-3/root/usr/bin/gcc -O3 -fopenmp -mcmodel=medmid -static -L/opt/rh/devtoolset-3/root/usr/lib/gcc/sparc64-redhat-linux/4.9.2 -o ../bin/bt.W.x bt.o initialize.o exact_solution.o exact_rhs.o set_constants.o adi.o rhs.o x_solve.o y_solve.o solve_subs.o z_solve.o add.o error.o verify.o ../common/print_results.o ../common/c_timers.o ../common/wtime.o -lm -L/opt/rh/devtoolset-3/root/usr/lib/gcc/sparc64-redhat-linux/4.9.2/lib/ 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lm 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lrt 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lpthread 
/opt/rh/devtoolset-3/root/usr/libexec/gcc/sparc64-redhat-linux/4.9.2/ld: cannot find -lc 

有沒有一種方法,我可以從gcc 4.9.2而從gcc 4.4.7連接剩餘庫鏈接不僅僅是libgomp庫?

+0

通常情況下,您將設置PATH以將包含gcc的所需目錄置於系統之前,並將LD_LIBRARY_PATH置於相應的/ lib64 /(假設爲64位gcc)。 – tim18

+0

你能詳細點嗎?但是,我嘗試導出LD_LIBRARY_PATH並將'/ opt/rh/devtoolset-3/root/usr/lib /'添加到路徑中,但這不會改變鏈接器對庫的使用。它仍然使用默認庫,當執行結果程序時會導致段錯誤。 –

回答

0

編譯器全部使用系統libgcc, libstdc++,版本4.4.7,因此無法編譯,例如, C++ 11。

我猜gcc53-c++-5.3.0-1.el6.x86_64.rpm會做。內部*/gcc53/lib64{libgcc_s.so**, libgomp.so**, libstdc++}(版本5.3.0)...提供/usr/bin/{ gcc53, g++53 }

該軟件包是在一年前創建的...經過充分測試,作爲額外的編譯器。下載鏈接:https://drive.google.com/file/d/0B7S255p3kFXNbTBneHgwSzBodFE/view?usp=sharing

+0

最初的文章是針對SPARC的,但是,它是Oracle Linux的平臺端口(不是上游RHEL或Fedora的一部分)。 –

0

如果你打算做-Wl,-Bstatic的事情,一定要遵循它通過-Wl,-Bdynamic立即您添加庫爭吵後恢復到正常。默認情況下,並非所有的系統庫都安裝了靜態版本,這就是爲什麼您可以獲得cannot find -lc

所以,你可以試試這個作爲你的解決辦法的修改:

-Wl,-Bstatic ~/libgomp.a -Wl,-Bdynamic

不漂亮,而這個問題值得更好的答案(這仍然是相當多的黑客攻擊),但它應該得到現在完成的工作。