关于librdkafka编译错误问题解决

在windows使用librdkafka的时候,遇到的问题较多,总结有如下问题:

1、编译器问题,首先最新的librdkafka项目使用了C++11相关语法,所以如果要编译该项目,必须保证编译器兼容C++11语法,也就是编译器要vs2013以上,请摒弃vs2008,vs2010;

2、部分librdkafka项目没有vs的解决方案solution,需要生成对应的解决方案,此时需要下载cmake且支持使用vs 2013以上的本地编译器(cmake3.1.3已经支持vs2017了),至于使用cmake生成solution的方法我已经在之前文章讲过,此处不再重复(注意一点就是:一般看项目下面的cmake文件夹的readme.txt一般都会有详细说明cmake生成solution的方法---特别是cmake生成solution过程需要配置的环境变量)

3、这里我下载最新的librdkafka主干项目版本是kafka_2.11-0.11.0.0.tgz,解压之后里面就已经包含对应的vs的解决方案了,路径:librdkafka-master\win32\librdkafka.sln

4、剩下的就是编译器编译问题,也总结一下:

      (1)由于C++11问题,选择版本有:vs2013、vs2015、vs2017,根据网友提供建议,不建议使用vs2015(安装问题),所以直接升级到vs2017,升级后安装了win10的sdk和update3可选安装包,但是打开librdkafka项目之后,一直编译不通过,提示win7 sdk未安装(win7上使用vs2017),然后单独下载win7 sdk安装后,依然没有效果(最后本来可以解决的,但是还是使用了vs2015----解决方法:项目属性-->配置属性-->常规,然后在右侧选项中将“平台工具集”默认选择的vs141删除,即不指定使用工具集)

(2)安装vs2015,这里就是一个坑,我说网友怎么不建议使用vs2015,安装后出现问题:没有VC++项目选项卡,通过点击安装对应工具模板之后,重启第一次有模板,关闭后重新打开,模板又没有了(安装的vs2015专业版的中文版和英文版,效果都一样),第二个就是安装后卸载不了update3(因为kafka必须依赖update3更新),然后重复卸载安装都不能安装c++模板(可能是卸载不了vs2015 的update3更新--报找不到对应文件,所以卸载不掉),最后直接重装系统;然后安装了vs企业中文版本(不是专业版本),最后终于可以使用vs2015了;

      (3)编译问题:打开librdkafka之后编译librdkafka工程:

        报错:a.无法解析的外部符号:__iob_func       解决方法: 在C文件中(我选择的是rdkafka.c文件中)末尾添加实现:

/*
* 当libjpeg-turbo为vs2010编译时,vs2015下静态链接libjpeg-turbo会链接出错:找不到__iob_func,
* 增加__iob_func到__acrt_iob_func的转换函数解决此问题,
* 当libjpeg-turbo用vs2015编译时,不需要此补丁文件
*/
#if _MSC_VER>=1900
#include "stdio.h" 
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus 
extern "C"
#endif 
FILE* __cdecl __iob_func(unsigned i) {
	return __acrt_iob_func(i);
}
#endif /* _MSC_VER>=1900 */
添加的原因如下:


根据关键字在网上找到一些文章描述了类似的错误,大都是找不到外部符号 __iob ,原因是 VS2010 上使用了 VC6 编译的 DLL 。虽然与我的情况不同,但是原理是一样的,我遇到的这个问题的原因是 VS2015 下使用VS2010编译的静态库,因为我用的 libjpeg-turbo静态库是从官网下载编译好的版本(应该是vs2010这样的版本编译的)。

其实 __iob_func 和 __iob 都是用来定义 stdin,stdout,stderr,只是不同的VC版本实现方式不同。

下面是VS2015的头文件corecrt_wstdio.h中对stdin,stdout,stderr定义

ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);

#define stdin  (__acrt_iob_func(0))
#define stdout (__acrt_iob_func(1))
#define stderr (__acrt_iob_func(2))

原来在 VS2015 中 __iob_func 改成了 __acrt_iob_func 

报错:b.无法解析的外部符号 __imp___vsnprintf    解决方法:在link链接库中添加legacy_stdio_definitions.lib然后编译即可解决该错误;

5、openssl安装,请下载 Win32OpenSSL-1_0_1g_5100003558626907361.exe 然后在线安装下载,将openssl/include和openssl/lib/vc添加如头文件以及lib链接库中

6、最后就是关于librdkafka使用,间后续章节介绍

猜你喜欢

转载自blog.csdn.net/lixiang987654321/article/details/76854251