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下面的include和lib两个文件夹

文档里面一段这样的话

Static linking of Microsoft's C RunTime (CRT):
==============================================
If you are using mode=static nmake will create and link to the static build of
libcurl but *not* the static CRT. If you must you can force nmake to link in
the static CRT by passing RTLIBCFG=static. Typically you shouldn't use that
option, and nmake will default to the DLL CRT. RTLIBCFG is rarely used and
therefore rarely tested. When passing RTLIBCFG for a configuration that was
already built but not with that option, or if the option was specified
differently, you must destroy the build directory containing the configuration
so that nmake can build it from scratch.

VS生成代码的时候有一个运行库选项(项目属性 - 配置属性 - C/C++ - 代码生成 - 运行库)/MT和/MD(/MTd和/MDd是对应的debug版本)

就是说你编译时如果加了RTLIBCFG=static这个选项,就相当于编译了/MT版本的libcurl,否则是/MD版本的


2.打开VS2013新建项目选择Win32控制台应用程序,附加选项选择空项目

然后把前面编译出来的头文件夹和lib文件夹复制到项目所在路径。工程右键添加-现有项,把libcurl_a.lib加入工程

新建一个cpp文件,测试一下能否使用

#include "include/curl/curl.h"

int main()
{
	curl_easy_init();
	return 0;
}
报错:

error LNK2019: 无法解析的外部符号 __imp__curl_easy_init,该符号在函数 _main 中被引用

fatal error LNK1120: 1 个无法解析的外部命令

libcurl没有链接到程序中,找不到这个函数入口

解决方案:打开项目属性,配置属性 - C/C++ - 预处理器 - 预处理器定义 - 打开下拉框 - 编辑 - 文本框输入CURL_STATICLIB - 保存(或者在curl.h中#define CURL_STATICLIB)

重新编译

报错:

1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(lseeki64.obj) : error LNK2005: __lseeki64 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(dosmap.obj) : error LNK2005: __errno 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(tolower.obj) : error LNK2005: _tolower 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(wsetloca.obj) : error LNK2005: __configthreadlocale 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(winapisupp.obj) : error LNK2005: ___crtSetUnhandledExceptionFilter 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(winapisupp.obj) : error LNK2005: ___crtTerminateProcess 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(winapisupp.obj) : error LNK2005: ___crtUnhandledException 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(_file.obj) : error LNK2005: ___iob_func 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z 已经在 MSVCRTD.lib(cinitexe.obj) 中定义
1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LIBCMT.lib(fflush.obj) : error LNK2005: _fflush 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
1>LINK : warning LNK4098: 默认库“MSVCRTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>e:\documents\visual studio 2013\Projects\ConsoleApplication5\Debug\ConsoleApplication5.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

解决方案:项目属性 - 配置属性 - C/C++ - 代码生成 - 运行库,根据编译的libcurl版本选择/MT或/MD,把项目设置成release,平台x86

重新编译运行成功。


vc2008构建和使用libcurl静态库:http://blog.csdn.net/mos2046/article/details/7697530


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页