Visual Studio C++ libcurl库的静态链接库模式安装过程记录和一些避雷点,以及不需要修改VS项目配置的便携式安装方法。
下载
到https://curl.se/download.html下载最新版本,什么压缩格式都可以,下载后解压缩。本文中解压缩路径为D:\curl\
,下文中出现该路径请自行替换为你的实际路径。
编译
首先一定要打开VS环境“Developer Command Prompt for VS 2022”的命令行,只有VS环境的命令行才自带编译命令,普通命令行没有编译环境。可以在开始菜单输入developer快速定位打开。
打开命令行后,切换到D:\curl\winbuild目录下,输入以下命令生成debug/release模式和x86/64平台的lib文件,或者你只需要哪个版本只生成对应版本的也可以。
1 2 3 4 | nmake /f Makefile.vc mode=static DEBUG=yes MACHINE=x86 nmake /f Makefile.vc mode=static DEBUG=no MACHINE=x86 nmake /f Makefile.vc mode=static DEBUG=yes MACHINE=x64 nmake /f Makefile.vc mode=static DEBUG=no MACHINE=x64 |
生成结果如下图:
生成的lib文件在D:\curl\builds目录下,分别为win32/64的debug和release模式。obj文件夹是中间过程文件夹,可删除。
复制
首先进入对应配置和平台的schannel目录,打开lib目录,重命名libcurl????.lib加上对应配置和平台名以便区分。比如libcurl-x86-debug.lib、libcurl-x64-release.lib。
然后复制:
- 在你的项目文件夹(以.vcxproj文件所在文件夹为基准)新建文件夹curl。
- 复制D:\curl\include\curl里的所有h文件到项目curl文件夹。
- 复制刚才重命名的几个lib文件到你项目curl文件夹。
项目curl文件夹最终如下图:
项目代码添加curl库
在项目的头文件中,添加代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #define CURL_STATICLIB // libcurl需要 #pragma comment(lib, "wininet.lib") #pragma comment(lib, "Ws2_32.lib") // libcurl需要 #pragma comment(lib, "Wldap32.lib") // libcurl需要 #pragma comment(lib, "Crypt32.lib") // libcurl需要 #pragma comment(lib, "Normaliz.lib") // libcurl需要 #include "curl/curl.h" #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "curl/libcurl-x64-debug.lib") #else #pragma comment(lib, "curl/libcurl-x64-release.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "curl/libcurl-x86-debug.lib") #else #pragma comment(lib, "curl/libcurl-x86-release.lib") #endif #endif |
安装完成。然后就可以直接使用curl代码了。上面的代码可以不修改VS项目文件,只需要复制curl文件夹和添加代码到所有需要libcurl库的项目即可,避免每次给项目添加Libcurl库时还需要修改VS项目配置,改配置要改x86/64和debug/release一共四次配置太麻烦。
下面是最简单的示例程序:获取baidu首页并在屏幕上输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream> #include "header.h" // 里面有curl安装代码 int main() { CURL* curl_handle; curl_global_init(CURL_GLOBAL_ALL); curl_handle = curl_easy_init(); if(!curl_handle)return -1; curl_easy_setopt(curl_handle,CURLOPT_URL,"http://www.baidu.com"); CURLcode res = curl_easy_perform(curl_handle); curl_easy_cleanup(curl_handle); curl_global_cleanup(); return 0; } |
避雷点
CURL_STATICLIB
必须添加预定义CURL_STATICLIB
。否则编译自己项目时提示无法解析的外部符号错误。
额外的lib文件
必须链接额外的引用项Ws2_32.lib、Wldap32.lib、Crypt32.lib和Normaliz.lib。否则编译自己项目时提示无法解析的外部符号错误。
文章评论