我正在尝试构建一个用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和libp线程,这样我就可以最小化部署程序所需的dll数量(以上三个dll并不是该程序唯一依赖的dll)。因此,我尝试使用以下命令静态地链接libgomp和libp线程:
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): undefined reference to_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 address 0x0 in section.ctors‘的未定义引用 d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: 最后链接失败:无效操作
然后,我尝试使用与MinGW一起安装的CodeLite + GCC 4.8.1环境执行完全相同的编译和链接命令。如果出现不同的错误消息,则会再次失败:
./tmp/hshfitcmdline.o:hshfitcmdline.cpp:(.text.unlikely+0x105):对
\_Unwind\_Resume' ./tmp/hshfitcmdline.o:hshfitcmdline.cpp:(.text$\_ZN9NormalMapD1Ev[\_\_ZN9NormalMapD1Ev]+0xb4): undefined reference to_Unwind_Resume‘的未定义引用 d:/mingw-4.8.1/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: ./tmp/hshifcmdline.o:`.text$_ZN9NormalMapD1Ev__ZN9NormalMapD1Ev‘中错误的reloc地址0xb4’ d:/mingw-4.8.1/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: 最后链接失败:无效操作regt2.exe:错误: ld返回 退出状态设置:* build/rspfitter错误1
我确认文件"libgomp.a"/"libgomp.dll.a“存在于MinGW dir/lib/gcc/ MinGW 32/4.8.1/两个MinGW安装程序中。然而,他们是不同的大小!在从MinGW.org下载的安装中,'libgomp.a‘为86 In,"libgomp.dll.a“为87 In;然而,在CodeLite安装中,大小分别为74 In和148 In。
现在我想知道:
谢谢
发布于 2014-12-29 12:58:47
要静态地链接libgomp,可以这样做。
ln -s `g++ --print-file-name=libgomp.a` && \
g++ foo.o -static-libgcc -static-libstdc++ -L. -o foo -fopenmp -ljpeg -lopenblas但是,您的可执行文件仍将依赖于p线程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,那么可能仍然存在未定义的引用。
https://stackoverflow.com/questions/27688778
复制相似问题