静态链接与openmp

时间:2018-01-20 18:40:11

标签: gcc openmp ld

我正在使用libgomp在Ubuntu 16.04上构建一个共享对象。我的目标是通过静态链接任何通常不在基本分布中的东西(使用docker ubuntu或alpine图像作为参考基线),使这个最终对象尽可能便携。我已经能够很容易地与其他依赖项一起完成此操作,但我已经挂了libgomp。

我可以使用-fopenmp选项轻松链接,并获得动态链接:

# ldd *.so
linux-vdso.so.1 =>  (0x00007fff01df4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9ba59db000)
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f9ba57b9000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9ba55a3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9ba5386000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9ba4fbc000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9ba6516000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9ba4db8000)

但如果我在-static之前天真地添加-fopenmp,我会:

relocation R_X86_64_32 against `__TMC_END__' can not be used when making a shared object; recompile with -fPIC

足够公平;与我的其他依赖项我刚从源代码构建,以启用PIC和我需要的任何其他选项。但是当我尝试用libgomp做同样的事情时,我没有运气。我从http://gcc.gnu.org/svn/gcc检查了gcc 5.5,并尝试从gcc/libgomp文件夹构建。已生成配置脚本,但运行它会返回:

./config.status: line 1486: ./../../config-ml.in: No such file or directory
好的,显然这与多库支持有关,我不相信我需要它。运行./configure --help表示存在--enable-multilib选项且没有明显的默认值,但设置--enable-multilib=no--disable-multilib仍会返回相同的错误。我也尝试运行autoreconf -fiv来重新生成配置脚本,但是我收到了这个错误:

configure.ac:5: error: Please use exactly Autoconf 2.64 instead of 2.69.

如果我明确安装并使用autoreconf2.64,我会得到这个:

configure.ac:65: error: Autoconf version 2.65 or higher is required

我错过了什么?

1 个答案:

答案 0 :(得分:2)

我缺少的是libgomp与gcc的其余部分不可构建的事实。只需升级一个级别并在启用-fPIC的情况下运行整个构建:

export CFLAGS="-O3 -fPIC"
export CXXFLAGS="-O3 -fPIC"
./configure --disable-multilib --enable-languages=c,c++
make
make install

它在libgomp.a中提供了/usr/local/lib64的副本,准备链接到我的共享对象。

跟进:

虽然这很有效,至少在测试环境中,在Jim Cownie的上述评论之后我们决定暂时从我们的库中禁用OpenMP支持。