尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Win10+VS2019编译Curl 7.84.0静态库:从CMake配置到项目集成实战

Win10+VS2019编译Curl 7.84.0静态库:从CMake配置到项目集成实战 简介本资源是为Windows 10平台开发者准备的、开箱即用的CURL 64位静态/动态链接库套件基于最新稳定版7.84.0源码使用CMake 3.22与Visual Studio 2019完整编译生成专为C/C网络编程初学者及项目集成者设计可快速解决HTTPS请求、文件上传下载、API调用等常见网络通信需求。压缩包共19个文件含11个头文件.h用于接口声明、2个构建配置文件.am、1个README说明文档、1个动态链接库.dll、1个导入库.lib、1个导出符号文件.exp、1个预编译可执行程序curl.exe整体仅354KB结构精简已按标准lib/include目录组织支持直接引入VS工程。目前已有774人学习下载用户可立即获得包含头文件、链接库、运行时DLL及命令行工具curl.exe的一体化部署方案无需自行编译或配置OpenSSL依赖显著降低跨平台网络库集成门槛。1. 项目缘起为什么要在Win10下自己编译Curl在Windows平台上做C/C开发尤其是涉及到网络通信、文件传输或者需要与各种Web API打交道时Curl库几乎是绕不开的瑞士军刀。它稳定、高效、功能全面支持HTTP、HTTPS、FTP等数十种协议。虽然官方提供了预编译的二进制包但很多时候我们还是会遇到需要自己动手编译的情况。最常见的原因有几个一是项目对Curl的版本有特定要求比如必须使用某个修复了关键Bug的版本如7.84.0二是需要集成特定的功能比如启用对某个加密库如OpenSSL、Schannel的深度支持或者禁用某些我们用不到的功能以减小库体积三是为了调试方便需要编译带调试符号Debug的库四是为了确保与现有开发环境如VS2019的运行时库如MT/MTd、MD/MDd完全匹配避免潜在的运行时冲突。我最近接手的一个遗留项目升级就卡在了这里。项目运行在64位的Windows 10上开发环境是Visual Studio 2019原先链接的是一个老版本的Curl动态库在接入一个新的HTTPS服务时出现了兼容性问题。排查后发现需要升级到Curl 7.84.0版本并且为了部署方便需要静态链接。官网上没有现成的、针对VS2019编译的7.84.0静态库于是自己动手编译就成了唯一的选择。这个过程看似简单实则暗坑不少从环境准备、源码获取、编译配置到最终生成可用的库每一步都需要留意。接下来我就把这次完整的编译过程、遇到的坑以及解决方案详细记录下来。2. 战前准备理清需求与备齐弹药在开始敲命令之前我们必须先明确目标并准备好所有必要的工具和材料。盲目开始只会导致反复折腾。2.1 明确编译目标与参数我们的核心目标是在Windows 10 x64系统上使用Visual Studio 2019编译出Curl 7.84.0版本的64位库。但这还不够我们需要进一步细化库类型是动态库DLL还是静态库LIB我选择静态库这样最终生成的程序可以独立分发不依赖额外的libcurl.dll。但方法也适用于编译动态库。运行时库这是Windows C开发最容易出问题的地方。必须和你的主项目保持一致。通常VS2019新建项目默认使用/MD动态链接运行时库或/MDdDebug版。为了通用性我决定分别编译Release/MT和Debug/MTd两种配置的静态库。如果你需要动态链接运行时库则对应/MD和/MDd。功能模块Curl支持很多特性我们需要决定启用哪些。对于大多数HTTP/HTTPS应用必须开启SSL/TLS支持。在Windows上有两个主要选择使用Windows自带的Schannel安全通道或开源的OpenSSL。Schannel的优点是无需额外依赖但功能可能没有OpenSSL丰富。我选择Schannel以保持环境纯净。依赖库Curl依赖于libssh2、zlib、libidn2等库来实现更多功能。为了简化本次编译只开启最核心的HTTP/HTTPS基于Schannel和IPv6支持暂时不引入其他外部依赖。2.2 搭建编译环境工欲善其事必先利其器。我们需要以下软件Visual Studio 2019这是编译器本体。确保安装了“使用C的桌面开发”工作负载它包含了编译所需的MSVC编译器、链接器和基本的Windows SDK。建议通过Visual Studio Installer进行安装或修改。CMakeCurl项目已经转向使用CMake作为主要的构建系统虽然也保留旧的Makefile.vc。CMake是一个跨平台的编译配置工具它能生成VS的解决方案.sln文件。从 CMake官网 下载并安装最新稳定版如3.25安装时记得勾选“Add CMake to the system PATH for all users”。Git用于获取Curl源码。同样安装时确保将Git添加到系统环境变量PATH中。PerlCurl的构建脚本和一些依赖库如OpenSSL的编译需要Perl。推荐使用 Strawberry Perl 或 ActiveState Perl 安装后同样需确保perl命令在命令行中可用。NASM如果后续需要编译OpenSSL本次不需要则会用到这个汇编器。可以先安装备用。验证环境打开“开始”菜单找到“Visual Studio 2019”文件夹点击“x64 Native Tools Command Prompt for VS 2019”。这是一个关键步骤这个命令提示符环境已经为我们设置好了VS2019的64位编译工具链cl, link, nmake等的所有环境变量。在这个窗口里执行后续所有操作。2.3 获取与准备源代码一切就绪后我们获取指定版本的Curl源码。# 在刚才打开的VS2019 x64命令行中切换到一个合适的工作目录比如D:\Dev cd /d D:\Dev # 克隆Curl的Git仓库如果网络较慢可以尝试使用镜像源或直接下载源码包 git clone https://github.com/curl/curl.git # 进入源码目录 cd curl # 切换到我们需要的7.84.0版本标签 git checkout curl-7_84_0注意直接git clone默认是master分支可能包含未稳定的新特性。通过git checkout tags/curl-7_84_0可以精确切换到该版本发布时的代码快照确保可复现性。源码目录中我们需要关注几个关键文件/目录CMakeLists.txtCMake的配置文件。winbuild/传统的、使用nmake和Makefile.vc的构建目录。对于简单的编译这个方式有时更直接。lib/Curl库本身的源代码。src/Curl命令行工具curl.exe的源代码。3. 核心战役使用CMake生成VS工程并编译虽然Curl保留了旧的nmake构建方式但CMake是更现代、更灵活的选择特别是当我们需要精细控制编译选项时。这里我详细记录使用CMake的过程。3.1 配置CMake生成选项我们不使用CMake的图形界面GUI而是在命令行中完成这样更利于记录和自动化。在curl源码目录下创建一个用于存放编译产物的目录通常叫build# 在curl源码根目录 mkdir build cd build接下来运行cmake命令来配置项目。这是最关键的一步参数决定了最终库的形态。# 这是一条完整的配置命令我们逐段解释 cmake .. -G Visual Studio 16 2019 -A x64 ^ -DCMAKE_BUILD_TYPERelease ^ -DBUILD_SHARED_LIBSOFF ^ -DCURL_USE_SCHANNELON ^ -DCURL_USE_OPENSSLOFF ^ -DCURL_USE_LIBSSH2OFF ^ -DHTTP_ONLYON ^ -DENABLE_IPV6ON ^ -DCMAKE_INSTALL_PREFIX./output-G Visual Studio 16 2019指定生成器为VS2019。CMake用这个字符串标识VS版本。-A x64指定目标平台为64位。-DCMAKE_BUILD_TYPERelease指定构建类型为Release。注意对于多配置生成器如Visual Studio这个变量有时不直接生效我们主要靠后面打开.sln文件后选择配置。但设置它是个好习惯。-DBUILD_SHARED_LIBSOFF核心选项。OFF表示构建静态库libcurl.libON则表示构建动态库libcurl.dll。-DCURL_USE_SCHANNELON启用Windows自带的Schannel作为SSL/TLS后端。-DCURL_USE_OPENSSLOFF禁用OpenSSL。与Schannel二选一。-DCURL_USE_LIBSSH2OFF禁用SSH支持简化编译。-DHTTP_ONLYON重要简化选项。只编译HTTP和HTTPS相关的代码禁用FTP、SMTP等其他协议可以显著减少库体积和编译依赖。-DENABLE_IPV6ON启用IPv6支持。-DCMAKE_INSTALL_PREFIX./output指定“安装”目录。执行cmake --install时编译好的库和头文件会被复制到这个目录方便我们取用。执行这条命令后CMake会进行一系列检测和配置。如果看到Configuring done和Generating done并且没有报错说明配置成功。此时在build目录下会生成一个curl.sln解决方案文件。3.2 执行编译与安装配置成功后我们可以直接用CMake调用MSBuild进行编译也可以直接用Visual Studio打开.sln文件编译。命令行方式更高效# 编译整个解决方案的Release版本 cmake --build . --config Release # 编译整个解决方案的Debug版本 cmake --build . --config Debug--config参数指定了编译配置Release/Debug。这会分别生成对应配置的库文件。编译完成后库文件libcurl.lib位于build/lib/Release或build/lib/Debug目录下。但为了获取一个干净、完整的产出包括头文件最好执行“安装”步骤# 将Release版本的文件“安装”到预设的目录 cmake --install . --config Release # 将Debug版本的文件也“安装”到预设目录通常Debug文件会输出到带d后缀的目录或不同子目录取决于CMake设置 # 一种常见做法是分别指定不同的前缀 cmake -DCMAKE_INSTALL_PREFIX./output_debug --build . --target install --config Debug执行后查看./output目录和./output_debug你会看到类似这样的结构output/ ├── include/ │ └── curl/ │ ├── curl.h │ ├── easy.h │ └── ... (其他头文件) └── lib/ └── libcurl.lib (Release版静态库)现在include文件夹里的头文件和lib文件夹里的库文件就可以被你的项目引用了。4. 备选方案与排坑实录当CMake之路不通时理论上上面CMake的流程应该能解决大部分问题。但现实往往骨感你可能会遇到各种奇怪的问题比如CMake找不到编译器、某个依赖检测失败等。这时我们可以退一步使用Curl自带的、更传统的nmake构建方式。这个方法更“原始”但也更直接绕过了CMake的一些抽象层。4.1 使用NMake和Makefile.vc编译首先回到Curl源码的winbuild目录cd /d D:\Dev\curl\winbuild在这个目录下有一个BUILD.WINDOWS.txt文件是官方的手册但更直接的方法是查看Makefile.vc文件和使用说明。编译命令的通用格式如下# 在VS2019 x64命令行中确保当前目录是 winbuild nmake /f Makefile.vc modestatic/dll vc版本 genpdb/debug rtlstatic/dynamic sslschannel/openssl ipv6yes/no我们需要将其具体化。以下命令用于编译一个静态库modestatic使用VS2019vc16生成Release版本不指定gen和rtl时默认是/MT使用Schannelsslschannel启用IPv6ipv6yesnmake /f Makefile.vc modestatic vc16 sslschannel ipv6yes如果你想编译Debug版本会生成libcurl_debug.lib并使用/MTd可以加上gendebug或rtldynamic等组合具体需要参考Makefile.vc内的逻辑。一个常见的Debug静态库编译命令是nmake /f Makefile.vc modestatic vc16 sslschannel ipv6yes gendebug执行命令后nmake会开始编译。生成的库文件位于上一级目录curl根目录下的builds文件夹里路径类似builds\libcurl-vc16-x64-release-static-ipv6-sspi-schannel根据参数不同目录名会变化。在这个目录的lib子文件夹里就能找到libcurl.lib。4.2 编译过程中常见问题与解决无论用CMake还是NMake都可能踩坑。以下是我遇到或常见的一些问题“找不到 Windows SDK”或“无法打开 include 文件: windows.h”原因VS2019虽然安装了但可能没有安装对应版本的Windows SDK或者环境变量没设置对。解决打开Visual Studio Installer修改你的VS2019安装确保在“单个组件”中勾选了合适版本的Windows 10 SDK例如10.0.19041.0。使用“x64 Native Tools Command Prompt”可以避免大部分环境变量问题。CMake配置时Schannel或其它特性检测失败原因CMake在探测系统能力时可能因为路径或权限问题失败。解决首先确保在正确的命令行环境中操作。其次可以尝试在CMake命令中显式地关闭不需要的检测例如强制指定-DCMAKE_USE_SCHANNELON旧变量名或-DCURL_USE_SCHANNELON。仔细阅读CMake运行输出的信息看具体哪一步报错。链接时出现“LNK2005: _malloc 已经在 libcmt.lib 中定义”等重复定义错误原因这是经典的运行时库冲突。你的主项目可能使用/MD动态链接运行时库而你编译的Curl库使用的是/MT静态链接运行时库或者反过来。解决必须保持统一。检查你的项目属性 - C/C - 代码生成 - 运行时库。确保你使用的Curl库的编译配置Release/Debug, /MT/MTd/MD/MDd与此处完全一致。这就是为什么我建议分别编译Release和Debug、静态运行时库版本的原因以便灵活匹配。使用编译好的库时提示找不到__imp_curl_easy_init等链接错误原因这通常是因为你尝试链接一个动态库DLL的导入库.lib但却没有定义CURL_STATICLIB宏。解决如果你编译的是静态库libcurl.lib那么在你的项目中必须在包含curl.h头文件之前定义宏CURL_STATICLIB。这可以通过在项目属性 - C/C - 预处理器 - 预处理器定义中添加CURL_STATICLIB来实现或者在你的源代码中#include curl/curl.h之前加上#define CURL_STATICLIB。这个宏会告诉头文件你使用的是静态库从而避免生成动态链接的导入声明。NMake编译失败提示“无法找到指定文件”或语法错误原因Makefile.vc可能对路径中有空格或特殊字符支持不好或者Perl环境未正确设置。解决确保源码路径全英文、无空格。确保Perl已安装并加入PATH。以管理员身份运行VS命令行有时也能解决权限问题。5. 成果验收在VS2019项目中集成与测试编译出库文件只是第一步正确集成到你的项目中并跑通测试才是终点。5.1 项目配置假设你有一个VS2019的C控制台项目需要集成我们刚编译好的Curl静态库。包含头文件目录在项目属性 - C/C - 常规 - 附加包含目录中添加Curl头文件所在路径即D:\Dev\curl\output\include。添加库目录在项目属性 - 链接器 - 常规 - 附加库目录中添加Curl库文件所在路径即D:\Dev\curl\output\lib。添加依赖库在项目属性 - 链接器 - 输入 - 附加依赖项中添加libcurl.lib。对于Debug配置如果你编译了Debug版的库可能叫libcurl_debug.lib或位于不同路径这里需要换成对应的库文件名并确保库目录也指向正确位置。定义静态库宏在项目属性 - C/C - 预处理器 - 预处理器定义中添加CURL_STATICLIB。这一步对于静态库至关重要指定子系统对于控制台程序在项目属性 - 链接器 - 系统中将子系统设置为“控制台 (/SUBSYSTEM:CONSOLE)”。运行时库一致性再次确认你的项目属性 - C/C - 代码生成 - 运行时库与Curl库编译时使用的选项一致例如都是/MT。5.2 编写测试代码创建一个简单的测试源文件例如main.cpp#define CURL_STATICLIB // 必须在包含curl.h之前定义 #include curl/curl.h #include iostream int main() { CURL* curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl curl_easy_init(); if (curl) { // 设置一个测试URL这里用httpbin.org的一个简单接口 curl_easy_setopt(curl, CURLOPT_URL, https://httpbin.org/get); // 设置SSL后端为Schannel如果是静态编译且只用了Schannel这个设置可能非必须但显式设置是好习惯 // curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); // 设置不验证证书仅用于测试生产环境务必验证 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // 执行请求 res curl_easy_perform(curl); // 检查错误 if (res ! CURLE_OK) { std::cerr curl_easy_perform() failed: curl_easy_strerror(res) std::endl; } else { std::cout \nRequest succeeded! std::endl; } // 清理 curl_easy_cleanup(curl); } curl_global_cleanup(); return 0; }5.3 编译运行与问题排查编译你的项目。如果一切配置正确应该能成功生成.exe文件。如果链接成功但运行崩溃首先检查运行时库是否一致。然后尝试将编译的Curl静态库和你的可执行文件放在同一目录下虽然静态链接不需要DLL但有些依赖如Schannel是系统组件以管理员身份运行试试。使用Debug版本并连接调试器查看崩溃点。如果链接失败仔细检查附加依赖项中的库文件名是否正确大小写是否匹配库路径是否包含在附加库目录中。确认CURL_STATICLIB宏已定义。网络请求失败检查返回的错误码。如果是SSL相关错误如CURLE_SSL_CONNECT_ERROR可能是Schannel的配置或系统证书问题。可以尝试暂时关闭证书验证如上例所示仅用于测试来确认是否是证书问题。生产代码中绝对不要禁用证书验证。当你的测试程序成功输出目标网站的内容或“Request succeeded!”时恭喜你一个完全由你在Win10VS2019环境下亲手打造、量身定制的Curl 7.84.0 64位库就已经成功集成并可以投入使用了。这个过程虽然繁琐但带来的好处是深远的你对所使用的库有了完全的控制权版本、功能、兼容性都尽在掌握这对于构建稳定、可复现的软件环境至关重要。本文还有配套的精品资源点击获取
返回列表