天天看点

vc2008构建和使用libcurl静态库

 2>用VC2008/2005打开工程curl-7.26.0\lib\libcurl.vcproj,转换下工程并构建,可以直接编译成功!

3>新建个控制台工程测试下刚才编译的静态库libcurl.lib,可以在libcurl\curl-7.26.0\docs\examples目录找个简单的使用curl的例子,在这个工程选项Configuration Properties-| C/C++ -|General -|Additional Include Directories 路径中加入curl7.26\include, 在linker选项卡,指定静态库路径和静态库的名字libcurl.lib,代码如下

#include "stdafx.h"  

#include <Windows.h>  

#include "curl/curl.h"  

int _tmain(int argc, _TCHAR* argv[])  

{  

    CURL *curl;  

    CURLcode res;  

    curl = curl_easy_init();  

    if(curl) {  

        curl_easy_setopt(curl, CURLOPT_URL, "http://2345.com/?kduba");  

        res = curl_easy_perform(curl);  

        curl_easy_cleanup(curl);  

    }  

    return 0;  

}  

 此时cpp文件可以编译,但是链接报错

1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_init

1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_setopt

1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_perform

1>testcurl.obj : error LNK2001: unresolved external symbol __imp__curl_easy_cleanup

看样子根本没有链接静态库,虽然刚才指定了库的路径,确认库路径的名字没错,于是看了下curl_easy_init 这个函数的定义,

CURL_EXTERN CURL *curl_easy_init(void);  

CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);  

CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);  

CURL_EXTERN void curl_easy_cleanup(CURL *curl);  

/* 

 * Decorate exportable functions for Win32 and Symbian OS DLL linking. 

 * This avoids using a .def file for building libcurl.dll. 

 */  

#if (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)) && \  

     !defined(CURL_STATICLIB)  

#if defined(BUILDING_LIBCURL)  

#define CURL_EXTERN  __declspec(dllexport)  

#else  

#define CURL_EXTERN  __declspec(dllimport)  

#endif  

 看到这里于是明白了,如下操作:

在libcurl静态库工程选项Configuration Properties-| C/C++ -| Preprocessor 中加上BUILDING_LIBCURL宏

在测试工程选项Configuration Properties-| C/C++ -| Preprocessor 中加上CURL_STATICLIB宏,然后依次重新构建两个工程

发现测试工程链接不过

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_unbind_s

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_msgfree

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ber_free

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_memfree

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_value_free_len

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_get_values_len

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_next_attribute

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_first_attribute

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_get_dn

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_next_entry

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_first_entry

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_search_s

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_simple_bind_s

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_init

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_set_option

1>libcurl_MT.lib(ldap.obj) : error LNK2001: unresolved external symbol __imp__ldap_err2string

谷歌了下, WSACleanup function msdn  是需要链接Ws2_32.lib,

同样的道理

是少了Wldap32.lib

在libcurl静态库工程选项Configuration Properties-|Librarian -| Additional Dependencies 中加上依赖项Ws2_32.lib Wldap32.lib

再依次重编两个工程,就OK了

编译选项设为/MD时候,不需要添加Ws2_32.lib Wldap32.lib 

小结:

1>对于开源代码的编译问题,还是要从代码入手,包括注释

 2>静态库构建的时候很容易,但是要知道是不是成功的,还得编个测试工程才能知道是不是真的OK

继续阅读