Windows 下使用libcurl的问题记录

上一篇文章写了libcurl在llinux下的使用以及编写程序的步骤:
https://blog.csdn.net/wcc27857285/article/details/86529034

 

今天尝试了下在Windows下使用libcurl开发,使用的是VS2017,不得不说在windows下遇到了很大的困难,几乎是花了一天的时间才解决

一.下载

进入官网的下载页面:https://curl.haxx.se/download.html

官网的下载链接有好多,我也是下了好几个打开研究过才发现我应该下哪个,有些不是我想要的
因为是在windows下安装,点击download页面下的这个zip包:

下载后解压出来,发现有非常多的资料,点击winbuild文件夹下的BUILD.WINDOWS.txt文件,这个文件详细说明了在windows下如何编译libcurl

 

二.编译

分几步:

1.打开vs开发人员工具

我是选择了第一个“适用于VS2017的x64本机工具命令提示”,

2.然后在控制台中,进入刚刚解压后的crul7.63.0文件夹下的winbulid目录

3.然后执行命令,这一步是最关键的
看文档中所说的:

使用 nmake   /f   Makefile.vc  mode=<static or dll>   <options> 

mode这里可以选static和dll,就是可选静态链接库还是动态链接库,后面的<options> 可以选择下面的一个或多个

比如加上了 WITH_ZLIB=static 就代表编译出来的lib是支持zlib的

我用的是 nmake  /f  Makefile.vc  mode=static   MACHINE=x64   DEBUG= no 

mode 和options 之间用空格隔开

4.回车执行,执行完毕后会在crul7.63.0文件夹下生成一个builds文件夹

我们点开第一个可以看到下面有三个文件夹

第一个bin,bin里面是curl.exe也就是命令行工具,可以用cmd进入到这个目录执行curl命令

第二个是include,包含了头文件

第三个是lib,里面就是生成的libcurl_a.lib,也就是我们最终要的静态链接库 

OK,至此编译完毕

 

三.编写代码

接下来我们打开VS2017,用libcurl库自己编写C/C++程序

1.新建VC++控制台程序

2.找到curl-7.63.0\docs\examples下面的https.c文件,打开,拷贝到程序中

// LibcurlExample.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"

#include <iostream>
#include <string>
#include <stdlib.h>
#include "curl/curl.h"
using namespace std;

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "lib/libcurl_a.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "Normaliz.lib")

int main(void)
{
	CURL *curl;
	CURLcode res;

	curl_global_init(CURL_GLOBAL_DEFAULT);

	curl = curl_easy_init();
	if (curl) {
		curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");

#ifdef SKIP_PEER_VERIFICATION
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
#endif

#ifdef SKIP_HOSTNAME_VERIFICATION
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
#endif

		/* Perform the request, res will get the return code */
		res = curl_easy_perform(curl);
		/* Check for errors */
		if (res != CURLE_OK)
			fprintf(stderr, "curl_easy_perform() failed: %s\n",
				curl_easy_strerror(res));

		/* always cleanup */
		curl_easy_cleanup(curl);
	}
	curl_global_cleanup();
	getchar();
	return 0;
}

3.然后就F5运行,编译

失败了,提示 “无法解析的外部符号 _curl_global_init” 等7个错误

LibcurlExample.obj : error LNK2019: 无法解析的外部符号 __imp_curl_global_init,该符号在函数 main 中被引用
LibcurlExample.obj : error LNK2019: 无法解析的外部符号 __imp_curl_global_cleanup,该符号在函数 main 中被引用
LibcurlExample.obj : error LNK2019: 无法解析的外部符号 __imp_curl_easy_strerror,该符号在函数 main 中被引用
LibcurlExample.obj : error LNK2019: 无法解析的外部符号 __imp_curl_easy_init,该符号在函数 main 中被引用
LibcurlExample.obj : error LNK2019: 无法解析的外部符号 __imp_curl_easy_setopt,该符号在函数 main 中被引用
LibcurlExample.obj : error LNK2019: 无法解析的外部符号 __imp_curl_easy_perform,该符号在函数 main 中被引用
LibcurlExample.obj : error LNK2019: 无法解析的外部符号 __imp_curl_easy_cleanup,该符号在函数 main 中被引用

4.然后是漫长的寻找解决方案之路,这里简单记录下我的

 

四.解决编译错误

1.添加库链接,这一步必须要有,否则程序根本无法运行

在代码中添加如下,上面的示例代码已经添加了

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "lib/libcurl_a.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "Normaliz.lib")

也可以在项目属性->VC++目录 中设置包含目录和库目录,如图,这个和#pragma comment是等价的

 

2.添加预编译命令 :属性->C/C++->预处理器 ->添加 CURL_STATICLIB

这一步必须有,否则也会报无法解析的外部符号 _curl_global_init的错误

 

3.设置 运行库,统一代码生成方式

在项目属性->C/C++ -> 代码生成 -> 运行库 

如果项目是 Debug 就是多线程调试 /MDd,如果是 Release 就是多线程 /MD 

这一步不是必须,但最好设置一下,如果不匹配会报警告

 

OK,全部设置完毕,继续F5,还是报错,而且还是一样的“无法解析的外部符号 _curl_global_init7”个错误

在这里我花了很长时间找答案,可惜都无法解决,这一度让我怀疑我的lib文件是不是有问题

后来我才发现,我又一次吃了解决方案配置和解决方案平台的亏,在这里就是debug和release的问题

原来我生成的lib文件是release的,如图:

而我上面的设置项目属性的截图,都是选择了Debug模式

也就是说我在debug模式下运行项目,针对debug模式做了一系列的设置,引入了release的lib文件,所以不管我怎么设置都是针对debug项目的设置,liburl_a.lib都是不支持的

 

主页上的设置和属性页上的设置,还有lib文件,这三者的关系是:

编译F5时,会根据主页上的设置来编译项目,然后会根据主页上的设置模式,寻找属性页中对应的设置来加载这些设置,然后会引入设置中或者代码中引入的lib文件
那么很明显lib是relase的,我们得把主页上改成release-x64,然后在属性页上再设置一遍release-x64的设置

 

所以知道真相的我,立马把解决方案配置改成了release和x64,也就是这里:

然后我在右键项目选择属性打开,可以看到依然还是Debug和x64:

原来在VS主页上设置完release和x64,在打开项目属性弹窗,属性页的设置是不会跟随主页上的设置变化的

也就是属性页上的是分了Debug,Release,x86-x64 ,一共四种组合,需要我们手动设置,每种组合下都有自己的库目录,包含目录,附加链接库,预编译命令等等等等的一套设置

 

然后我在属性页上配置成了release和x64,把上面三步再设置了一次,再F5运行,OK成功了

 

 

如果想要Debug的话,那么就编译一分Debug的lib

nmake /f Makefile.vc mode=static MACHINE=x64  DEBUG=yes

然后在builds下又生成了一套debug的lib

然后选择debug模式,使用libcurl_a_drbug.lib,也能正常运行

 

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值