我正在使用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
我错过了什么?
答案 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支持。