2017-06-15 108 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

不漂亮,而这个问题值得更好的答案(这仍然是相当多的黑客攻击),但它应该得到现在完成的工作。