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

How to link libgomp statically when linking other libraries dynamically?

本文关键字:链接 静态 libgomp 其他 动态      更新时间:2023-10-16

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

LibJPEG

布拉斯和拉帕克

犰狳

开放MP

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

g++ -o ./build/rspfitter {a list of .o files} -L{libraries 的路径} -ljpeg -lopenblas -lgomp -lpthread

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

libgomp-1.dll

libpthread-2.dll

pthreadGC2.dll

我认为静态链接 libgomp 和 libpthread 可能是一个更好的主意,这样我就可以最大限度地减少我需要部署程序的 dll 数量(上述三个 dll 并不是程序所依赖的唯一 dll)。所以我尝试使用以下命令静态地仅链接 libgomp 和 libpthread:

g++ -o ./build/rspfitter {a list of .o files} -L{libraries 的路径} -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.unpossible+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 退出状态:*** [构建/rspfitter] 错误 1

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

现在我想知道:

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

  2. 我到底如何才能正确地静态链接 libgomp?

谢谢

要静态链接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则可能仍然存在未定义的引用。