我目前正在尝试在 SPARC S7 服务器上使用 Oracle Linux 6 操作系统来运行 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 文件夹 (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
中的 libgomp
库,同时链接 gcc 4.4.7
中的其余库?
最佳答案
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
关于linux - 如何从多个位置(对应多个 GCC 版本)链接库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44576625/