gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:24:44 25 4
gpt4 key购买 nike

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

LibJPEG

BLAS and LAPACK

Armadillo

OpenMP

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

g++ -o ./build/rspfitter {a list of .o files} -L{paths to 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{paths to libraries} -ljpeg -lopenblas -Wl,-static -lgomp -lpthread

但这次它失败了,并显示以下错误消息:

d:/mingw/bin/../lib/gcc/mingw32/4.8.1\libgomp.a(env.o):(.text.startup+0xbfe): undefined reference to `_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): undefined reference to `_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:

final link failed: Invalid operation

然后我尝试使用与 CodeLite 一起安装的 MinGW + GCC 4.8.1 环境执行完全相同的编译和链接命令。它再次失败并显示不同的错误信息:

./tmp/hshfitcmdline.o:hshfitcmdline.cpp:(.text.unlikely+0x105): undefined reference to `_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/hshfitcmdline.o: bad reloc address 0xb4 in section `.text$_ZN9NormalMapD1Ev[__ZN9NormalMapD1Ev]'

d:/mingw-4.8.1/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe:

final link failed: Invalid operation collect2.exe: error: ld returned

1 exit status make: *** [build/rspfitter] Error 1

我确认文件“libgomp.a”/“libgomp.dll.a”存在于 [MinGW 目录]/lib/gcc/mingw32/4.8.1/中,用于两个 MinGW 安装。但是,它们的大小不同!从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,那么可能仍然会有 undefined reference 。

关于c++ - 动态链接其他库时如何静态链接libgomp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27688778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com