libcurl linux 静态链接库_libcurl第二课 编译静态库

本文详细介绍了如何在Linux环境下编译libcurl静态链接库,包括预处理器定义、编译选项以及解决链接错误的方法。关键步骤包括设置预处理器宏`_DEBUG`、`BUILDING_LIBCURL`、`DEBUGBUILD`和`CURL_STATICLIB`,以及为HTTPS协议添加`USE_WINDOWS_SSPI`和`USE_SCHANNEL`。在链接阶段,需注意解决未解析的外部符号问题,如`curl_easy_init`,并添加必要的静态库如`Crypt32.lib`和`Wldap32.lib`。同时,定义`BUILDING_LIBCURL`以避免类型不一致的错误。
摘要由CSDN通过智能技术生成

1 编译libcurl静态库

确保C/C++页面下代码生成/运行库确保跟解决方案保持一致,确保常规下输出路径和目标文件名称(d)

2 C/C++属性页面中的预处理器属性页设置定义

_DEBUG

BUILDING_LIBCURL

DEBUGBUILD

CURL_STATICLIB

USE_WINDOWS_SSPI

USE_SCHANNEL

USE_WINDOWS_SSPI和USE_SCHANNEL两个预编译处理定义是用来定义HTTPS,为了使用https协议需要指定,切记!

注意:配置管理器中针对libcurl存在多个可以编译的版本,例如WINDOWS SSPI ,OPENSSL,  WOLFSSL等好几个版本,定义了USE_WINDOWS_SSPI就不需要引入OpenSSL的头文件以及库文件

3 调用工程C/C++属性页面中的预处理器属性页设置定义

BUILDING_LIBCURL

CURL_STATICLIB

因为宏定义主要作用于curl/curl.h头文件,用于头文件的宏定义条件编译,必须定义这两个宏定义,否则编译出错,看出错分析

2 链接错误分析

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

分析:不定义CURL_STATICLIB 编译结果,因为CURL_EXTERN CURL *curl_easy_init(void);函数之前有CURL_EXTERN定义,而该定义在

#ifdef CURL_STATICLIB

#  define CURL_EXTERN

#elif defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)

#  if defined(BUILDING_LIBCURL)

#    define CURL_EXTERN  __declspec(dllexport)

#  else

#    define CURL_EXTERN  __declspec(dllimport)

#  endif

#elif defined(BUILDING_LIBCURL) && defined(CURL_HIDDEN_SYMBOLS)

#  define CURL_EXTERN CURL_EXTERN_SYMBOL

#else

#  define CURL_EXTERN

#endif

这里被定义,如果没有定义CURL_STATICLIB,将会导致CURL_EXTERN被替换成__declspec(dllexport)或者__declspec(dllimport),这两个声明只应用于动态链接,不能应用于静态链接

2)error LNK2019: 无法解析的外部符号 __imp__ldap_init,该符号在函数 __ldap_free_urldesc 中被引用

在引用项目的属性中添加额外的静态库Crypt32.lib,Wldap32.lib,否则出现如下的错误,因为用到https

3)C2371 “curl_share_init”: 重定义;不同的基类型 libcurl

查看源码,如果没有定义BUILDING_LIBCURL,将导致curl_share_init在声明和定义中出现返回类型不一致的问题

#if defined(BUILDING_LIBCURL) || defined(CURL_STRICTER)

typedef struct Curl_easy CURL;

typedef struct Curl_share CURLSH;

#else

typedef void CURL;

typedef void CURLSH;

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值