Dev C++编译OpenMP程序后独立运行缺失libgomp_64-1.dll问题咨询
问题:Dev C++编译OpenMP程序后独立运行提示缺少libgomp_64-1.dll
我用Dev C开发C语言代码,为实现并行运行添加了<omp.h>头文件,编译时传入-fopenmp选项。程序在Dev C内直接运行正常,但单独执行生成的.exe文件时失败,提示找不到libgomp_64-1.dll。
以下是编译时的链接命令:
Processing C source file... -------- - C Compiler: C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\gcc.exe - Command: gcc.exe "C:\Users\jan.kubacka\OneDrive - GA Drilling\Documents\vypocty\Tl_new_model_Lee\feasibility study\znamzat\TH-DBHE_v02.c" -o "C:\Users\jan.kubacka\OneDrive - GA Drilling\Documents\vypocty\Tl_new_model_Lee\feasibility study\znamzat\TH-DBHE_v02.exe" -fopenmp -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc
我的疑问:
- 已确认存储
libgomp_64-1.dll的文件夹路径正确 - 知道把该DLL放到.exe目录能解决问题,但希望生成无需依赖任何辅助文件的独立可执行文件
- 若把这个exe传给没装Dev C++(无该DLL)的用户,对方是不是没法运行?之前以为编译后的exe会包含所有必要执行数据,这个理解是不是错了?
解答
- 静态编译消除DLL依赖
你的编译命令仅添加了-static-libgcc,这只静态链接了GCC的标准C库,但OpenMP依赖的libgomp是独立库,需要额外指定静态链接参数。修改编译命令,加入-static-libgomp,如果需要完全静态链接所有系统库,还可以加上-static参数,示例命令如下:
gcc.exe "你的源文件路径.c" -o "输出exe路径.exe" -fopenmp -static-libgcc -static-libgomp -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib"
这样编译生成的exe会将libgomp_64-1.dll的代码嵌入自身,无需额外携带任何DLL即可独立运行。
关于exe依赖的纠正
你的理解确实存在偏差:默认情况下,MinGW GCC(Dev C++使用的编译器)采用动态链接方式处理大部分库,这样生成的exe体积更小,还能共享系统中的库资源。但如果目标机器没有对应的DLL文件,程序就会启动失败。只有通过静态编译选项,编译器才会将所有依赖的库代码打包进exe,生成真正独立的可执行文件。无DLL环境的运行情况
如果不做静态编译,将exe传给未安装Dev C++的用户,对方确实无法运行程序。解决办法要么是静态编译生成独立exe,要么是将libgomp_64-1.dll与exe一起打包,让用户将DLL放在exe同一目录或系统PATH能识别的路径中。
内容的提问来源于stack exchange,提问作者argeus
相关产品推荐
相关产品推荐

