Chinaunix首页 | 论坛 | 博客
  • 博客访问: 565141
  • 博文数量: 127
  • 博客积分: 1169
  • 博客等级: 少尉
  • 技术积分: 1298
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-16 14:29
个人简介

空白

文章分类

全部博文(127)

分类: C/C++

2017-05-31 18:06:09

一、打开vs2013,新建项目WinLibcurlTest, 在项目目录下新建curl文件夹,将E:\01_code\tools\curl-7.54.0\include\curl目录下的.h文件拷贝到项目curl目录中,
将E:\01_code\tools\curl-7.54.0\build\Win32\VC12\LIB Release - LIB OpenSSL - LIB LibSSH2目录下的编译生成的libcurl.lib拷贝curl目录中
将E:\01_code\tools\libssh2-1.8.0-vc11-x86\lib\libssh2.lib拷贝到curl目录中
将E:\01_code\tools\openssl-1.0.2k-vc11-x86\lib目录下libeay32.lib、ssleay32.lib拷贝到curl目录中

将所有的.h文件添加到VS项目中

一、添加libcurl.dll和其它相关库到工程
1、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上头文件存放目录。

2、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。
   然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。



3、添加工程引用的dll动态库:把引用的dll放到工程的可执行文件所在的目录下
使用静态库,这部可忽略

二、编译过程中错误解决
1.
1>curlTest.obj : error LNK2019: 无法解析的外部符号 __imp__curl_global_init,该符号在函数 _main 中被引用
1>curlTest.obj : error LNK2019: 无法解析的外部符号 __imp__curl_global_cleanup,该符号在函数 _main 中被引用
1>curlTest.obj : error LNK2019: 无法解析的外部符号 __imp__curl_easy_init,该符号在函数 "int __cdecl curl_test(void)" (?curl_test@@YAHXZ) 中被引用
1>curlTest.obj : error LNK2019: 无法解析的外部符号 __imp__curl_easy_setopt,该符号在函数 "int __cdecl curl_test(void)" (?curl_test@@YAHXZ) 中被引用
1>curlTest.obj : error LNK2019: 无法解析的外部符号 __imp__curl_easy_perform,该符号在函数 "int __cdecl curl_test(void)" (?curl_test@@YAHXZ) 中被引用
1>curlTest.obj : error LNK2019: 无法解析的外部符号 __imp__curl_easy_cleanup,该符号在函数 "int __cdecl curl_test(void)" (?curl_test@@YAHXZ) 中被引用
错误原因:编译的libcurl.lib是release版本,WinLibcurlTest编译的是debug版本,版本不一置。

2.
1>LINK : fatal error LNK1104: 无法打开文件“libcurl.lib”
1、给工程添加依赖的库:项目->属性->链接器->输入->附加依赖项,把libcurl.lib、ws2_32.lib、winmm.lib、wldap32.lib添加进去

2、加入预编译选项:项目->属性->c/c++ ->预处理器->预处理器定义,添加BUILDING_LIBCURL

再次编译,报如下错误:
1>libcurl.lib(easy.obj) : error LNK2001: 无法解析的外部符号 _libssh2_init
1>libcurl.lib(easy.obj) : error LNK2001: 无法解析的外部符号 _libssh2_exit
1>libcurl.lib(version.obj) : error LNK2001: 无法解析的外部符号 _libssh2_version
给工程添加依赖的库:项目->属性->链接器->输入->附加依赖项,把libssh2.lib添加进去
再次编译,报如下错误:
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSL_write
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSL_ctrl
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSL_CTX_ctrl
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSL_get_error
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSLv3_client_method
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSLv23_client_method
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSL_shutdown
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSL_set_connect_state
1>libcurl.lib(openssl.obj) : error LNK2001: 无法解析的外部符号 _SSL_library_init
给工程添加依赖的库:项目->属性->链接器->输入->附加依赖项,把libeay32.libssleay32.lib添加进去
再次编译,成功。
最终的附加依赖项如下:


三、测试
运行WinLibcurlTest.exe,弹出如下错误:

将E:\01_code\tools\libssh2-1.8.0-vc11-x86\bin目录下libssh2.dll拷贝到WinLibcurlTest.exe所在目录下,再次运行WinLibcurlTest.exe,报如下错误:

将E:\01_code\tools\openssl-1.0.2k-vc11-x86\bin目录下libeay32.dll拷贝到WinLibcurlTest.exe所在目录下,再次运行WinLibcurlTest.exe,报如下错误:

将E:\01_code\tools\openssl-1.0.2k-vc11-x86\bin目录下ssleay32.dll拷贝到WinLibcurlTest.exe所在目录下,再次运行WinLibcurlTest.exe
程序运行成功:

测试代码如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "curl/curl.h"

  4. // 添加依赖库
  5. #pragma comment(lib, "libcurl.lib")
  6. #pragma comment(lib, "ws2_32.lib")
  7. #pragma comment(lib, "winmm.lib")
  8. #pragma comment(lib, "wldap32.lib")


  9. size_t write_data(void* buffer, size_t size, size_t nmemb, void* userp)
  10. {
  11.     static int current_index = 0;
  12.     current_index++;
  13.     printf("current: %d\n", current_index);
  14.     printf("%s\n", (char*)buffer);
  15.     int temp = *(int*)userp;
  16.     return nmemb;
  17. }

  18. int curl_test(void)
  19. {
  20.     CURL* curl = curl_easy_init();
  21.     if (NULL == curl)
  22.     {
  23.         printf("(curl is NULL!/r/n");
  24.         return -1;
  25.     }

  26.     int my_param = 1;
  27.     // 设置目标URL
  28.     curl_easy_setopt(curl, CURLOPT_URL, "");
  29.     // 设置接收到HTTP服务器的数据时调用的回调函数
  30.     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
  31.     // 设置自定义参数(回调函数的第四个参数)
  32.     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &my_param);
  33.     // 执行一次URL请求
  34.     CURLcode res = curl_easy_perform(curl);
  35.     // 清理干净
  36.     curl_easy_cleanup(curl);
  37.     return 0;
  38. }

  39. int main()
  40. {
  41.     curl_global_init(CURL_GLOBAL_ALL);
  42.     curl_test();
  43.     curl_global_cleanup();
  44.     getchar();
  45.     return 0;
  46. }
阅读(14597) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

zjxiuqiao2017-11-22 09:20:41

BUILDING_LIBCURL 这个字段很重要的,  没加的话会报这个错误。
1>源.obj : error LNK2001: 无法解析的外部符号 __imp_curl_easy_setopt
1>源.obj : error LNK2001: 无法解析的外部符号 __imp_curl_easy_perform
1>源.obj : error LNK2001: 无法解析的外部符号 __imp_curl_easy_cleanup
1>源.obj : error LNK2001: 无法解析的外部符号 __imp_curl_global_init
1>源.obj : error LNK2001: 无法解析的外部符号 __imp_curl_global_cleanup
1>源.obj : error LNK2001: 无法解析的外部符号 __imp_curl_easy_i