如何动态链接其他库时静态链接libgomp?

时间:2014-12-29 12:20:45

标签: c++ gcc mingw openmp static-linking

我正在尝试构建一个用C ++编写的图像处理程序,该程序依赖于以下使用MinGW + MSYS(带GCC4.8.1)的库,我从www.mingw.org/下载到Windows 8 64位计算机上

  

的libjpeg

     

BLAS和LAPACK

     

犰狳

     

OpenMP的

我已成功编译了所有源代码文件(当然使用-fopenmp标志),然后我用以下语句链接:

  

g ++ -o ./build/rspfitter {.o文件列表}   -L {库的路径} -ljpeg -lopenblas -lgomp -lpthread

正确生成了可执行文件。但是,它要求以下dll:

  

libgomp-1.dll

     

libpthread-2.dll

     

pthreadGC2.dll

我认为将静态链接libgomp和libpthread更好一点,这样我就可以最小化我需要部署程序所需的dll数量(以上三个dll不是程序所依赖的dll)。所以我尝试使用以下命令静态链接libgomp和libpthread:

  

g ++ -o ./build/rspfitter {.o文件列表}   -L {库的路径} -ljpeg -lopenblas -Wl,-static -lgomp -lpthread

但这次失败并显示以下错误消息:

  

d:/ MinGW的/ bin中/../ LIB / GCC /的mingw32 / 4.8.1 \ libgomp.a(env.o):( text.startup + 0xbfe):   未定义的引用`_imp__pthread_attr_init'

     

d:/ MinGW的/ bin中/../ LIB / GCC /的mingw32 / 4.8.1 \ libgomp.a(env.o):( text.startup + 0xc13):   未定义的引用`_imp__pthread_attr_setdetachstate'

     

d:/ MinGW的/ bin中/../ LIB / GCC /的mingw32 / 4.8.1 \ libgomp.a(env.o):( text.startup +为0x3C):   未定义的引用`_imp__pthread_attr_setstacksize'

     

d:/ MinGW的/ bin中/../ LIB / GCC /的mingw32 / 4.8.1 /../../../../的mingw32 / bin中/ ld.exe:

     

d:/ mingw / bin /../ lib / gcc / mingw32 / 4.8.1 \ libgomp.a(env.o):bad reloc   “.ctors”

部分的地址0x0      

d:/ MinGW的/ bin中/../ LIB / GCC /的mingw32 / 4.8.1 /../../../../的mingw32 / bin中/ ld.exe:

     

最终链接失败:操作无效

然后我尝试使用与CodeLite一起安装的MinGW + GCC 4.8.1环境执行完全相同的编译和链接命令。它再次失败并显示不同的错误消息:

  

./ TMP / hshfitcmdline.o:hshfitcmdline.cpp :( text.unlikely + 0x105):   未定义的引用`_Unwind_Resume'

     

./ TMP / hshfitcmdline.o:hshfitcmdline.cpp :(文本$ _ZN9NormalMapD1Ev [__ ZN9NormalMapD1Ev] + 0xb4):   未定义的引用`_Unwind_Resume'

     

d:/mingw-4.8.1/bin /../ LIB / GCC /的mingw32 / 4.8.1 /../../../../的mingw32 / bin中/ ld.exe:

     

./ tmp / hshfitcmdline.o:部分中的错误重定位地址0xb4   `的.text $ _ZN9NormalMapD1Ev [__ ZN9NormalMapD1Ev]'

     

d:/mingw-4.8.1/bin /../ LIB / GCC /的mingw32 / 4.8.1 /../../../../的mingw32 / bin中/ ld.exe:

     

最终链接失败:无效的操作collect2.exe:错误:ld返回

     

1退出状态make:*** [build / rspfitter]错误1

我确认,对于MinGW的两个安装,[MinGW目录] /lib/gcc/mingw32/4.8.1/上都存在“libgomp.a”/“libgomp.dll.a”文件。但是,它们的大小不同!在从MinGW.org下载的安装中,'libgomp.a'是86kb,“libgomp.dll.a”是87kb;但是,在CodeLite安装中,大小分别为74kB和148Kb。

现在我想知道:

  1. 两个MinGW系统给出错误消息的原因是什么?可能是我从MinGW下载的静态库被清除了吗?但是动态链接在两个系统上都非常好。

  2. 我怎样才能正确链接libgomp?

  3. 由于

1 个答案:

答案 0 :(得分:2)

要静态链接libgomp,您可以

ln -s `g++ --print-file-name=libgomp.a` && \
g++ foo.o -static-libgcc -static-libstdc++ -L. -o foo -fopenmp -ljpeg -lopenblas

但是,您的可执行文件仍将依赖于pthread dll。您收到错误的原因是libc仍在动态链接。要解决此问题,您必须静态链接libc

ln -s `g++ --print-file-name=libpthread.a` && \
ln -s `g++ --print-file-name=libc.a` && \
g++ foo.o -static-libgcc -static-libstdc++ -L. -o foo -fopenmp -ljpeg -lopenblas

但是,如果openblasjpeg库依赖于libc,则可能仍会有未定义的引用。