linux - 如何从多个位置(对应多个 GCC 版本)链接库?

标签 linux gcc linker openmp

我目前正在尝试在 SPARC S7 服务器上使用 Oracle Linux 6 操作系统来运行 NPB 基准测试(具有 OpenMP 多线程支持)。操作系统预装了 gcc 4.4.7,缺少 Niagara 7 优化。我从 Oracle Yum 存储库下载了 devtoolset-3gcc 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);这些方法都不起作用:

  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 中的 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/

相关文章:

c - 链接到 Cmake 中不存在的共享库

c - kbuild 外部模块问题

linux - Pthreads 作为 UNIX 中同时控制台输入的标准解决方案?

c - 共享库和 rpath

c++ - XGCC stdarg.h 没有这样的文件或目录

c++ - 为什么在内联构造函数中访问静态成员时链接器失败

linux - 有没有办法让 gcc 输出原始二进制文件?

linux - Debian Stretch 上的 Redis 启动问题(九)

linux - 如何在 dhcp 数据包中填写 dhcp vendor specific option

macos - Apples GCC 在哪里/如何在可执行文件中存储 DWARF