我目前正在尝试在SPARC S7服务器上使用Oracle Linux 6 OS来运行NPB基准测试(支持OpenMP多线程)。操作系统预装了gcc 4.4.7
,缺少Niagara 7优化。我从Oracle Yum存储库下载了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
)中的库的方法;没有一种方法可行:
-Xlinker -rpath=lib_location
-Wl -Bstatic
-L lib_location
我最接近的是使用-Wl -Bstatic ~/libgomp.a
或-static -L ~/libgomp.a
时。它无法找到驻留在默认gcc lib文件夹(libm
)中的usr/lib
等库。
用于链接的实际命令是:
/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
我是否可以在libgomp
链接其余库时从gcc 4.9.2
链接gcc 4.4.7
库?
答案 0 :(得分:0)
devtoolset
编译器都使用系统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
答案 1 :(得分:0)
如果您要执行-Wl,-Bstatic
事情,请务必在-Wl,-Bdynamic
之后立即关注,以便在添加库参数后重置为正常。默认情况下,并非所有系统库都安装了静态版本,这就是您获得静态版本的原因。 cannot find -lc
。
因此,您可以尝试将此作为对变通方法的修改:
-Wl,-Bstatic ~/libgomp.a -Wl,-Bdynamic
不漂亮,这个问题值得一个更好的答案(这仍然是一个黑客攻击),但它现在应该完成工作。