C++ 编译和运行 LibCurl 动态库和静态库
简 述:
- C++ Win11 通过源码编译 libcurl 获取其动态库和静态库
- C++ 链接和使用 libcurl 的静态库和动态库
- 通过 vcpkg 来编译和链接 libcurl 的库
文章目录
- 下载 CURL 库
- 编译动态库 & 静态库
- C++ 项目中使用 CURL 库
- C++ 使用 CURL 动态库
- C++ 使用 CURL 静态库
- C++ 通过 vcpkg 使用 CURL 库
- 源码下载
- 其它更多
本文初发于 “偕臧的小站”,同步转载于此。
💻 win11 24H2
📎 Qt 5.15.2
📎 Visual Studio 2022
📎 C++17
下载 CURL 库
由于 CURL 只提供源码,并不提供编译好的二进制。所以只能自行编译动态库或者静态库。 官方推荐使用静态库,而非动态库;然而负责项目都是使用的动态库,那我们就都编译一番。
在 https://curl.se/download.html 下载最新版本源码压缩包 curl-8.15.0.zip。
准备工作:
解压得到 D:\project\third_dll\curl-8.15.0
文件夹。
- 右键管理员打开
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2022\Visual Studio Tools\VC\x64 Native Tools Command Prompt for VS 2022.lnk"
终端 - 终端打开进入到 winbuild 文件夹中
D:\project\third_dll\curl-8.15.0\winbuild
编译动态库 & 静态库
从 libcurl v8.15.0 开始,
winbuild
构建系统已标记为过时,将在 2025 年 9 月正式废弃,因此必须显式添加 WINBUILD_ACKNOWLEDGE_DEPRECATED=yes 确认才能继续使用该系统编译; 若是没有则会若是遇到报错:fatal error U1050: The user must acknowledge the deprecation warning to continue.
// 编译动态库
nmake /f Makefile.vc mode=dll VC=17 MACHINE=x64 DEBUG=no WINBUILD_ACKNOWLEDGE_DEPRECATED=yes// 编译静态库
nmake /f Makefile.vc mode=static VC=17 MACHINE=x64 DEBUG=no WINBUILD_ACKNOWLEDGE_DEPRECATED=yes
执行对应命令,可以看到很顺畅的编译过程
看到编译后的目标产物:动态库 libcurl-vc17-x64-release-dll-ipv6-sspi-schannel
和 静态库 libcurl-vc17-x64-release-static-ipv6-sspi-schannel
这两个文件夹
C++ 项目中使用 CURL 库
一共有三种方法,前两者为刚才本地编译的方式库链接使用,以及直接通过 vcpkg 进行编译和使用 curl 库。
- 将
libcurl-vc17-x64-release-dll-ipv6-sspi-schannel
改名为libcurl-dll
,方便使用(名字简短好认即可); - 将
libcurl-vc17-x64-release-static-ipv6-sspi-schannel
改名为libcurl-static
; - 再将这个文件夹拷贝到
D:\project\third_dll\UsedCurlDemo\tripartite
文件夹下备用(或者放在其它任意路径) - 开始创建 C++ 工程来引用这两个库
C++ 使用 CURL 动态库
可以看到生成的动态库
目录结构如下:
注意:不需需要添加 CURL_STATICLIB 宏,只需要链接 libcurl.lib 之外,还需要拷贝 libcurl.dll 文件到生成文件夹中。
-
创建一个 C++ 空的控制台项目
UsedCurlDemo
-
引入头文件 include 路径,和链接库 lib 的路径
-
在
main.cpp
函数中,输入如下代码#include <iostream> // 不需要使用 #define CURL_STATICLIB 宏 #include "curl/curl.h" #pragma comment (lib,"libcurl.lib")using namespace std;int main(int argc, char* argv[]) {CURL* curl;CURLcode res;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout << "返回状态: " << res << std::endl;system("pause");return 0; }
-
将
libcurl.dll
拷贝进 目标产物的路径,这是运行时所需要的
-
按下按键
Ctrl + F5
在 VS2022 中进行编译和运行,看到终端收到的 baidu 服务器返回结果
C++ 使用 CURL 静态库
可以看到生成的静态库
目录结构如下:
逻辑基本同理参考动态库,只是链接的文件不同;
注意:需要添加 CURL_STATICLIB 宏,且需要链接 libcurl_a.lib 之外,还需要链接一些额外的这些库,否则无法运行。
-
再创建一个 C++ 空的控制台项目
UsedCurlStaticDemo
, 方便直接放在同一个解决方案下 -
引入头文件 include 路径,和链接库 lib 的路径
-
在
main.cpp
函数中,输入如下代码#define CURL_STATICLIB // 是需要表示使用静态链接的宏 #define BUILDING_LIBCURL #include <iostream> #include "curl/curl.h"// 添加必要的库依赖,且需要链接除了 libcurl_a.lib 之外的这些库,否则无法运行 #pragma comment (lib,"libcurl_a.lib") #pragma comment (lib,"wldap32.lib") #pragma comment (lib,"ws2_32.lib") #pragma comment (lib,"Crypt32.lib") #pragma comment(lib, "normaliz.lib") // 添加以解决 IdnToAscii/IdnToUnicode 错误 #pragma comment(lib, "secur32.lib") // 添加以解决 InitSecurityInterfaceA 错误using namespace std;int main(int argc, char* argv[]) {CURL* curl;CURLcode res;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout << "返回状态: " << res << std::endl;system("pause");return 0; }
-
按下按键
Ctrl + F5
在 VS2022 中进行编译和运行,看到终端收到的 baidu 服务器返回结果
C++ 通过 vcpkg 使用 CURL 库
上面两种方法都需要手动配置和编译 LIBCURL 的动态库和静态库的头文件、链接库的文件夹路径;而采用 vcpkg 方法,则不需要这么麻烦,直接通过一次都本机配置好。
// 打开 cmd 终端,进入 D:\project\third_dll 路径,依次执行如下命令
git clone https://github.com/microsoft/vcpkg
.\vcpkg\bootstrap-vcpkg.bat
.\vcpkg\vcpkg install curlcd vcpkg
.\vcpkg integrate install // 这样项目就能直接引用 curl 了❯ vcpkg install cpp-httplib openssl // 还可以安装一些其它常用库
-
创建一个空的 C++ 控制台项目
vcpkgCurl
, -
在 main.cpp 中输入
#include <iostream> // 不需要使用 #define CURL_STATICLIB 宏 #include "curl/curl.h" // 也不需要 #pragma comment (lib,"libcurl.lib"),会自动链接 using namespace std;int main(int argc, char* argv[]) {CURL* curl;CURLcode res;curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");res = curl_easy_perform(curl);curl_easy_cleanup(curl);}std::cout << "返回状态: " << res << std::endl;system("pause");return 0; }
-
按下按键
Ctrl + F5
在 VS2022 中进行编译和运行,看到终端收到的 baidu 服务器返回结果
源码下载
源码和编译好的二进制下载:https://github.com/XMuli/NetworkExample
其它更多
上面编译的是libcurl的 dll,使用OpenSSL Dll版本和Zlib Dll版本。如果没有,可以从www.openssl.org 或者http://www.zlib.net/ 下载。