我目前正尝试在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.7
与libgomp 4.9.2
不兼容。我已经尝试了几种链接到gcc 4.9.2文件夹中的库(这是/opt/rh/devtoolset-3/root/usr/lib/gcc
);没有一种方法工作:如何链接来自多个位置的库(对应于多个GCC版本)?
-Xlinker -rpath=lib_location
-Wl -Bstatic
-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
库?
通常情况下,您将设置PATH以将包含gcc的所需目录置于系统之前,并将LD_LIBRARY_PATH置于相应的/ lib64 /(假设为64位gcc)。 – tim18
你能详细点吗?但是,我尝试导出LD_LIBRARY_PATH并将'/ opt/rh/devtoolset-3/root/usr/lib /'添加到路径中,但这不会改变链接器对库的使用。它仍然使用默认库,当执行结果程序时会导致段错误。 –