我正在尝试构建一个用C语言编写的图像处理程序,该程序依赖于使用MinGW MSYS(带GCC4.8.1)的以下库,我是从www.mingw.org/在Windows 8 64位计算机上下载的
LibJPEG BLAS和LAPACK Armadillo OpenMP
我已经成功编译了所有的源代码文件(当然用-fopenmp标志),然后我用以下语句链接:
g -o ./build/rspfitter -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 -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在
.ctors'中的reloc地址0x0:/ mingw / bin /../ lib / gcc / mingw32 / 4.8.1 /../../../../ mingw32 / bin / ld.exe:final链接失败:无效的操作
然后我尝试使用与CodeLite一起安装的MinGW GCC 4.8.1环境执行完全相同的编译和链接命令 . 它再次失败并显示不同的错误消息:
./tmp/hshfitcmdline.o:hshfitcmdline.cpp:(.text.unlikely 0x105):未定义引用
_Unwind_Resume'./tmp/hshfitcmdline.o:hshfitcmdline.cpp:(.text$_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?
谢谢
1 回答
要静态链接libgomp,你可以做到
但是,您的可执行文件仍将依赖于pthread dll . 您收到错误的原因是
libc
仍然是动态链接 . 要解决此问题,您还必须静态链接libc
但是,如果
openblas
或jpeg
库依赖于libc
,则可能仍会存在未定义的引用 .