libcurl开源库在VS2010环境下编译配置详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenlycly/article/details/71056875

一 准备

1.1 CURL官网下载地址:http://curl.haxx.se/download.html

1.2 找到源码包,官网最新版为7.54.0,但是这个压缩包的curl-7.54.0\projects\Windows路径下VC6-VC14各个版本的VS解决方案,但打开后编译会提示找不到openssl相关的头文件:

fatal error C1083: 无法打开包括文件:“openssl/ssl.h”: No such file or directory

应该是新增对SSL的支持,使用到了openssl,而openssl需要手动安装配置一下。配置openssl有两种方法,一种是下载安装包直接安装(就像使用WindowsSDK包一样),一种是将openssl的代码下载下来编译配置。当然是前者最简单,openssl安装配置参见:Windows下openssl的下载安装和使用http://www.cnblogs.com/lpxblog/p/5382653.html

    因为要实现发送邮件功能,网上下载的示例代码,基本没法使用,特别是网络处理这一块,邮件会经常发送失败。因为时间比较紧,要抓紧实现并测试效果,所以就没时间去配置安装openssl并编译新版本的libcurl。正好看到相关文章,得知7.32.0版本是可以直接拿来用VS2010编译的,于是到官网上去下载7.32.0版本,具体获取老版本的入口如下:


    本来因为手头的小项目急着用,以关键字curl到工程的目录中搜索,看看之前的项目中有没有libcurl库的工程,可以拿来直接编译,然后将编译出来的库拿过来直接使用,但是编译后拿到我们的工程中跑,结果curl_easy_perform接口调用失败,返回CURLE_UNSUPPORTED_PROTOCOL错误码,难道是当前的库不支持SMTP协议?按讲不应该啊,SMTP是官方支持的啊!查看代码才发现,之前有人使用CURL_DISABLE_SMTP和HTTP_ONLY宏将SMTP、FTP、telnet等不用的协议都裁剪了,只保留了主要的HTTP功能,c文件也从工程中删除了,但磁盘上还是有的。于是尝试着将SMTP等协议功能添加进来,将DISABLE宏注释掉,编译libcurl,提示链接不到SMTP模块的接口。后来发现smtp.c没有添加到工程中,即smtp.c没有编译,所以链接不到SMTP模块的接口。但是加进去后编译还是有问题,来回试了好几次还是不行,所以不得不到官网上下载新版本的libcurl,搜索libcurl的编译配置方法,只能使用官方的代码编译出库文件了。

    之前看到项目中mupdf模块也使用到了curl的代码,但也是被裁剪了,功能基本都被删完了,SMTP邮件发送模块肯定也被删除了,更是没法使用了。


二 步骤

2.1 打开curl-7.32.0\vs\vc8\lib\vc8libcurl.vcproj文件,VS2010会提示升级工程,下一步即可
VC工程里有些设置问题导致不能直接编译,需要稍作修改

2.2 打开工程属性 > C\C++ > 常规 > 附加包含目录。这里的包含目录是"..\include",而这个目录根本就不存在,它应该指向"curl-7.32.0\include"才对,所以把这里改成"..\..\..\include"。(或者直接完整路径也可以)

2.3 打开工程属性 > C\C++ > 预处理器 > 预处理器定义。这里有个默认宏"BUILDING_LIBCURL",如果要编译生成静态库,则要把它改成"CURL_STATICLIB"。这样,那些接口函数就不会被声明为导出函数了。

2.4 打开工程属性 > C\C++ > 库管理器 > 常规 > 附加依赖项。添加ws2_32.lib和wldap32.lib,这是CURL必须依赖的。或者在代码中使用#pragma comment预编译指令,手动引入这两个lib库。

2.5.把"libcurl.rc"从工程中移除,它只是版本信息,只会增大文件,去掉!(无所谓)


2.6 可编译出如下版本,根据需要手动设置编译
libcurld.lib //debug      Multi-threaded Debug (/MTd)
libcurl.lib  //release    Multi-threaded  (/MT)
//以上为32位静态库版本,生成exe体积大,包含库。

生成两种版本的均可。但是连接使用的时候注意对应版本。
libcurld.lib //debug     Multi-threaded DLL Debug (/MDD)
libcurl.dll //release    Multi-threaded DLL (MD)
//以上为动态库版本,生成exe体积小,不包含库。


2.7 如果自己的工程是64位的,并且使用的是curl的静态库,那么也需要将crul的静态库也编译成64位的。编译方法很简单,新建一个平台x64,并将配置项直接从win32对应的配置项继承过来就可以了。

三 结果测试

3.1 然后开始测试如何使用。
为了测试lib文件,新建一个控制台程序,将curl下的include文件夹和刚才生成的静态库拷贝到当前工程的目录下,并设置好包含路径以及依赖库路径。(此处注意debug和release不同,以免影响后期工程调试)

3.2默认是动态库,如果要编译成静态库,则打开工程属性 > C\C++ > 预处理器 > 预处理器定义。添加"CURL_STATICLIB"。



3.3 添加依赖库文件:ws2_32.lib和wldap32.lib,这个库是libcurl需要的。



3.4 找个自带的例子测试 /docs/examples/simple.c源文件

    #include "stdafx.h"  
    #include <stdio.h>  
    #include <curl/curl.h>    

    #pragma comment(lib,"libcurl.lib")  

    int _tmain(int argc, _TCHAR* argv[])  
    {  
        CURL *curl;  
        CURLcode res;  
        curl = curl_easy_init();  
        if(curl) {  
            curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");  
            /* example.com is redirected, so we tell libcurl to follow redirection */  
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);  

            /* 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);  
        }  

        return 0;  
    }  

3.5 实例测试结果


PS:其实本文不能算是原创,也是在别人文章的基础上加上自己遇到的问题,修改而来的!

展开阅读全文

没有更多推荐了,返回首页