vc2008构建和使用libcurl静态库

1>下载CURL源代码curl-7.26.0.zip

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,代码如下

[cpp] view plaincopy

  1. #include "stdafx.h"

  2. #include <Windows.h>

  3. #include "curl/curl.h"
  4. int _tmain(int argc, _TCHAR* argv[])

  5. {

  6. CURL *curl;

  7. CURLcode res;
  8. curl = curl_easy_init();

  9. if(curl) {

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

  11. res = curl_easy_perform(curl);

  12. curl_easy_cleanup(curl);

  13. }

  14. return 0;

  15. }

此时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 这个函数的定义,

[cpp] view plaincopy

  1. CURL_EXTERN CURL *curl_easy_init(void);

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

  3. CURL_EXTERN CURLcode curl_easy_perform(CURL *curl);

  4. CURL_EXTERN void curl_easy_cleanup(CURL *curl);
  5. /*

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

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

  8. */

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

  10. !defined(CURL_STATICLIB)

  11. #if defined(BUILDING_LIBCURL)

  12. #define CURL_EXTERN  __declspec(dllexport)

  13. #else

  14. #define CURL_EXTERN  __declspec(dllimport)

  15. #endif

  16. #else

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

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

发现测试工程链接不过

1>libcurl_MT.lib(easy.obj) : error LNK2001: unresolved external
symbol [email protected]
1>libcurl_MT.lib(telnet.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(easy.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(telnet.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(tftp.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(telnet.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(ftp.obj) : error LNK2001: unresolved external symbol[email protected]
1>libcurl_MT.lib(select.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(asyn-thread.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(transfer.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(sendf.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(sendf.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(telnet.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(sendf.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(ftp.obj) : error LNK2001: unresolved external symbol[email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(telnet.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(ftp.obj)
: error LNK2001: unresolved external symbol[email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(curl_addrinfo.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(select.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol __imp__conn[email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(tftp.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(ftp.obj)
: error LNK2001: unresolved external symbol[email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(curl_addrinfo.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(telnet.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(ftp.obj)
: error LNK2001: unresolved external symbol[email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(connect.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(curl_addrinfo.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(curl_addrinfo.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(tftp.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(tftp.obj)
: error LNK2001: unresolved external symbol [email protected]
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
1>libcurl_MT.lib(ftp.obj) : error LNK2001: unresolved external symbol[email protected]
1>libcurl_MT.lib(ftp.obj) : error LNK2001: unresolved external symbol[email protected]
1>libcurl_MT.lib(select.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(select.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(nonblock.obj)
: error LNK2001: unresolved external symbol [email protected]
1>libcurl_MT.lib(curl_gethostname.obj)
: error LNK2001: unresolved external symbol[email protected]

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

同样的道理

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

是少了Wldap32.lib

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

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

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

小结:

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

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

时间: 2024-10-13 13:05:24

vc2008构建和使用libcurl静态库的相关文章

libcurl 静态库编译

转载:http://www.cnblogs.com/jkcx/p/6406706.html 1.下载最新版的libcurl(官网:http://curl.haxx.se/download.html),并解压.(本例以vs2012 + curl-7.54.1.zip为例),如果使用curl-7.54.1版本,http://pan.baidu.com/s/1pL6xg6J 2.打开VS2012 开发人员命令提示,并CD进入 curl-7.54.1/winbuild/ 目录 打开命令行 切换目录 执行

Windows下编译libcurl.lib静态库

1.下载最新版的libcurl,我的是curl-7.44.0.zip,解压,进入目录winbuild,仔细阅读BUILD.WINDOWS.txt这篇文档 打开VS2013 开发人员命令提示并执行nmake /f Makefile.vc mode=static VC=12 完成编译后libcurl静态库会出现在builds目录下包括头文件和libcurl_a.lib,我们需要的是builds/libcurl-vc12-x86-release-static-ipv6-sspi-winssl下面的in

用Visual Studio2017写静态库

造轮子是一件有趣的事情,VS是一个强大的工具,能胜任超大规模的工程,但是讲真,对不那么大的项目配置起来不是那么友好(网上的其他教程也一点都不友好Orz).这里就展示一下构建一个简单的静态库的正确姿势.(顺便教一点道理 创建解决方案--许多人搞不清工程/项目Project和解决方案Solution的区别,在VS中,Project是基本的执行单元,一个Solution可以包含多个Project--我们的静态库就将会包含几个(.lib)Project和一个(.exe)Project用作测试.解决方案选

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用

继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). cd /home/ccj/CMakeDemo mkdir t3   cd /backup/cmake/t3 mkdir lib   在t3目录下建立CMakeLists.txt,内容如下: PRO

HelloWorld CMake Demo 03:CMake中构建静态库与动态库及其使用

? 继续完善Hello World,建立它的共享库, 包括静态库和动态库. ? 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). ? 一,准备工作: 在/home/ccj/CMakeDemo目录建立t3目录,用于存放本节涉及到的工程. cd /home/ccj/CMakeDemo mkdir t3 ? 二,建立共享库

在iOS中创建静态库

如果你作为iOS开发者已经有一段时间,可能会有一套属于自己的类和工具函数,它们在你的大多数项目中被重用. 重用代码的最简单方法是简单的 拷贝/粘贴 源文件.然而,这种方法很快就会成为维护时的噩梦.因为每个app都有自己的一份代码副本,你很难在修复bug或者升级时保证所有副本的同步. 这就是静态库要拯救你的.一个静态库是若干个类,函数,定义和资源的包装,你可以将其打包并很容易的在项目之间共享. 在本教程中,你将用两种方法亲手创建你自己的通用静态库. 为了获得最佳效果,你应该熟悉Objective-

浅析静态库链接原理

静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方.本文简要描述linux下静态库在链接过程中的一些细节. 静态库文件格式 静态库远远不同于动态库,不涉及到符号重定位之类的问题.静态库本质上只是将一堆目标文件进行打包而已.静态库没有标准,不同的linux下都会有些细微的差别.大致的格式wiki上描述的较清楚: Global header ----------------- +------------------------------- File header 1 --->

linux下编译qt5.6.0静态库——configure配置

 随笔 - 116  文章 - 4  评论 - 7 linux下编译qt5.6.0静态库--configure配置 linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberry选项: Android 选项: 生成makefile 遇到链接检查失败的情况 生成makefile后进行编译 编译时的错误 多重定义'QT_MODBUS()'和'QT_MODBU

创建并使用静态库(ar 命令)

archive命令的功能是:创建或改动归档文件或者从归档文件里析取信息.能够简单的理解为一个打包工具,将成员文件依照一定的规则构建到.a文件里,通常这样的类型的归档文件用来将经常使用的例程组织为一个静态库,方便应用程序的链接. 重要參数: d - 从archive中删除模块,若指定v选项的话还会在删除的过程中信息打印: r - 以替换的方式添加模块: c - 强制创建一个库.无论已存在与否. s - 为库中的可重定位目标文件创建符号索引或者更新, 对一个库运行ar -s等价于对其运行ranlib