首页 文章

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

提问于
浏览
2

我正在尝试构建一个用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 回答

  • 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 ,则可能仍会存在未定义的引用 .

相关问题