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

时间:2017-06-15 20:37:07

标签: linux gcc linker openmp

我目前正在尝试在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.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
  4. 我最接近的是使用-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库?

2 个答案:

答案 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

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