我正在尝试构建一个用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”
部分的地址0x0d:/ 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。
现在我想知道:
两个MinGW系统给出错误消息的原因是什么?可能是我从MinGW下载的静态库被清除了吗?但是动态链接在两个系统上都非常好。
我怎样才能正确链接libgomp?
由于
答案 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
但是,如果openblas
或jpeg
库依赖于libc
,则可能仍会有未定义的引用。