关于librdkafka编译错误问题解决
2017-08-07 18:10
471 查看
在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文件中)末尾添加实现:
根据关键字在网上找到一些文章描述了类似的错误,大都是找不到外部符号
其实
下面是VS2015的头文件
原来在 VS2015 中
报错:b.无法解析的外部符号 __imp___vsnprintf 解决方法:在link链接库中添加legacy_stdio_definitions.lib然后编译即可解决该错误;
5、openssl安装,请下载 Win32OpenSSL-1_0_1g_5100003558626907361.exe 然后在线安装下载,将openssl/include和openssl/lib/vc添加如头文件以及lib链接库中
6、最后就是关于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使用,间后续章节介绍
相关文章推荐
- 关于Mac os gradle 编译时报‘could not download gradle.jar…’的错误问题解决
- 关于boost在vs中的编译错误的问题的解决
- command line warning #10006: ignoring unknown option '/NODEFAULTLIB'错误解决(XPDF编译时出现的问题)
- librdkafka 0.7 编译失败解决办法
- 关于邮件中Cannot convert MIME message to Notes Rich Text message错误的问题的解决
- 关于在FC6中安装m68k-elf-tools交叉编译碰到的问题及解决方法
- 把一个动态库改成静态编译库时提示MSVCRTD.lib已经在××中编译过的错误的解决办法
- 关于Qt编译时问题的一个非常奇怪的解决方法
- 关于编译servlet时javax.servlet.http.*无法找到的解决这不是个容易的问题
- 关于VS2005编译wince Application 时缺少DLL问题的解决
- Eclipse 编译错误问题解决
- busybox1.9编译错误问题解决方法
- DirectShow 在vs2005中的问题解决之其它类文件编译错误问题处理
- 关于SQL Server 2005服务无法启动,报3417错误。(附带重装SQL时解决COM+目录问题)(转帖)
- 关于"Windows不能在本地计算机启动Apache2.......并参考特定服务错误代码1"问题解决
- VS2008编译DirectX SDK 2004 summer版的Sound例子程序出现的libcp.lib找不到的问题的解决办法
- 关于“未指定的错误”的问题 的比较正解的解决方法
- C/C++编译时的Link.EXE错误问题与解决方法
- 关于SQL服务器无法启动,报3417错误(附带解决安装SQL COM+目录问题)
- 关于“未指定的错误”的问题 的比较正解的解决方法