如何在动态链接其他库时静态链接 libgomp
How to link libgomp statically when linking other libraries dynamically?
我正在尝试构建一个用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。
现在我想知道:
-
两个MinGW系统给出的错误消息的原因可能是什么?会不会是我从MinGW下载的静态库被篡改了?但是动态链接在两个系统上都很好。
-
我到底如何才能正确地静态链接 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
但是,如果openblas
或jpeg
库依赖于libc
则可能仍然存在未定义的引用。
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 为什么当我在 C 程序中链接静态库时会"undefined symbol"?
- 强制链接静态库与 cmake 不起作用
- CMake 项目链接静态库
- 使用 CMake 在 Mac 上链接静态 GLFW 和 OpenGL
- DLL 链接静态库 - 未使用函数中未解析的链接器符号
- 如何使用 WAF 链接静态库?
- 无法在 Mac OS X 上链接静态资源库
- MAPI 链接静态库 (LNK2019: 未解析的外部符号)
- 为什么G 不链接静态程序
- 节点本机模块 - 链接静态库
- 在链接链接静态(GSOAP)库的共享库时,为什么会得到一个未定义的符号
- 链接静态和动态库时违反 ODR
- 代码中的MinGW::块不链接静态OpenSSL库
- Emscripten 链接静态库错误:wasm 流式编译失败:导入'env.getTempRet0'
- 如何正确链接静态类
- CMake 链接静态库和 glib 错误
- Eclipse CDT:如何在没有项目清理>>项目重建的情况下重新链接静态库
- 错误:链接静态库时出现";"
- gcc 如何链接静态库