针对 openmp 的静态链接

Static linking against openmp

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

我可以 link 使用 -fopenmp 选项就好了,并得到一个动态的 link:

# 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)

但是如果我天真地在 -fopenmp 之前添加 -static 我得到:

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 文件夹构建。已经生成了一个配置脚本,但是 运行 它 returns:

./config.status: line 1486: ./../../config-ml.in: No such file or directory

好的,显然这与多库支持有关,我认为我不需要。 运行 ./configure --help 显示有一个 --enable-multilib 选项,没有明显的默认值,但是设置 --enable-multilib=no--disable-multilib 仍然 returns 相同的错误。我也试过 运行 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

我错过了什么?

我所缺少的是 libgomp 不能独立于 gcc 的其余部分构建。这只是提升一个级别和 运行 启用 -fPIC 的整个构建的问题:

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

这给了我 /usr/local/lib64libgomp.a 的副本,可以链接到我的共享对象。

跟进:

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