You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译带libcurl依赖的C++程序:静态链接仍缺失DLL问题

问题:MinGW64编译C++程序跨机器运行时DLL缺失的解决办法

我编写了一个C++程序,功能是从网站抓取文本、获取Windows系统信息后通过Telegram发送。代码依赖的头文件如下:

#include <cstring>
#include <cstdio>
#include <fstream>
#include <iostream>
#include <sstream>
#include <time.h>
#include <map>
#include <curl/curl.h>
#include <string>
#include <stdio.h>
#include <thread>
#include <unistd.h>
#include <windows.h>
#include <locale>
#include <codecvt>

开发环境为Sublime Text搭配MSYS2的Mingw64,本机编译运行正常,但在另一台机器上启动时提示大量DLL缺失。使用以下编译命令解决了部分问题:

$ g++ .\keg.cpp my.res -lcurl -Wdeprecated-declarations -static-libstdc++ -static-libgcc -mwindows -o "test.exe"

但仍提示缺失libcurl-4.dll和libwinpthread-1.dll,将这两个DLL放到程序同目录后,又出现更多DLL缺失问题,求解决方法。


解决步骤

1. 安装静态版本的libcurl库

当前使用的是动态链接的libcurl,导致程序依赖libcurl-4.dll。在MSYS2的Mingw64终端中执行以下命令安装静态版libcurl:

pacman -S mingw-w64-x86_64-curl-static

2. 修改编译命令实现全静态链接

更新编译命令,强制静态链接所有依赖库,包括curl和线程库:

g++.exe .\keg.cpp my.res -Wdeprecated-declarations -static-libstdc++ -static-libgcc -static-libwinpthread -mwindows -static -lcurl -lcrypt32 -lwldap32 -lws2_32 -o "test.exe"
  • -static:强制静态链接所有库,避免动态DLL依赖
  • -static-libwinpthread:静态链接线程库,解决libwinpthread-1.dll缺失问题
  • -lcrypt32 -lwldap32 -lws2_32:libcurl静态编译时需要依赖的Windows系统库

3. 验证编译结果

编译完成后,用以下命令检查程序的DLL依赖:

objdump -x test.exe | grep DLL

如果输出仅包含Windows系统原生DLL(如kernel32.dll、user32.dll),说明静态编译成功,此时程序可直接在其他Windows机器上运行,无需额外携带DLL。

4. 处理其他潜在依赖

如果仍有DLL缺失,用pacman -Qs <依赖库名>检查是否安装了对应库的静态版本,若未安装则用pacman -S mingw-w64-x86_64-<库名>-static安装。


内容的提问来源于stack exchange,提问作者Giovanni Fittizio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:45:04