编译好的文件下载:

https://download.csdn.net/download/eamon100/16615370

Librdkafka依赖于zlib、Zstd和OpenSSL库,编译之前要先编译这三个库,本文只编译32位版本,64位编译方法类似。各库版本为:zlib-1.2.8,zstd-1.4.9、openssl-1.0.2p、librdkafka-1.5.3。

先编译openssl,需要openssl-1.0.2p nasm-2.14rc15-installer-x64.exe  ActivePerl-5.26.1.2601-MSWin32-x64-404865.exe 。

下载所需工具

  • Perl:http://downloads.activestate.com/ActivePerl/releases/5.26.1.2601/ActivePerl-5.26.1.2601-MSWin32-x64-404865.exe
  • NASM:https://www.nasm.us/pub/nasm/releasebuilds/2.14rc15/win64/nasm-2.14rc15-installer-x64.exe
  • OpenSSL:https://www.openssl.org/source/openssl-1.0.2p.tar.gz

准备工作

安装 Perl 和 NASM,默认下一步下一步就可以了。Perl 安装的时候记得勾选将执行程序添加到系统环境变量中。NASM 安装时没有选项,需要在完成后要将执行程序添加到系统的环境变量中。

1、开始编译openssl

只编译32位版本,debug模式,使用多线程调试静态链接运行库。

使用 x86 Native Tools Command Prompt for VS 2019,以管理员方式运行。

打开后切换到 D:\openssl-1.0.2p 目录,执行如下命令生成 makefile 文件。

perl configure VC-WIN32

如果是生成 64 位则

使用 x86 Native Tools Command Prompt for VS 2019,以管理员方式运行。

perl configure VC-WIN64A

成功后如下所示:

如果你要编译 debug 版本,则修改 ms/do_nasm.bat 文件,将原来

perl util\mkfiles.pl >MINFO

perl util\mk1mf.pl nasm VC-WIN32 >ms\nt.mak

perl util\mk1mf.pl dll nasm VC-WIN32 >ms\ntdll.mak

perl util\mk1mf.pl nasm BC-NT >ms\bcb.mak

perl util\mkdef.pl 32 libeay > ms\libeay32.def

perl util\mkdef.pl 32 ssleay > ms\ssleay32.def

修改为:

perl util\mkfiles.pl >MINFO

perl util\mk1mf.pl nasm debug VC-WIN32 >ms\nt.mak

perl util\mk1mf.pl dll nasm debug VC-WIN32 >ms\ntdll.mak

perl util\mk1mf.pl nasm BC-NT >ms\bcb.mak

perl util\mkdef.pl 32 libeay > ms\libeay32.def

perl util\mkdef.pl 32 ssleay > ms\ssleay32.def

就是将第二行和第三行编译选项增加了 debug。修改完成后执行 ms/do_nasm.bat。

ms\do_nasm.bat

运行后结果如下:

修改完成执行如下命令开始编译(如果想编译成 dll,则执行 nmake -f ms\ntdll.mak,编译前要修改 ms\ntdll.mak 将 CFLAG 的 /MD 属性修改为 /MT,与你调用项目匹配):

nmake -f ms\nt.mak

如果没有错误,几分钟后编译后的文件就会生成于 D:\openssl-1.0.2p\out32.dbg 目录下。

2、编译zlib

打开 zlib-1.2.8\contrib\vstudio\vc11目录下的zlibvc.sln,打开项目后,其中的zlibstat是编译为静态库,zlibvc是编译为动态库,本例使用静态库。

需要修改

#  ifdef ZLIB_WINAPI
#    ifdef FAR
#      undef FAR
#    endif
#    include <windows.h>
     /* No need for _export, use ZLIB.DEF instead. */
     /* For complete Windows compatibility, use WINAPI, not __stdcall. */

#    define ZEXPORT WINAPI
#    ifdef WIN32
#      define ZEXPORTVA WINAPIV
#    else
#      define ZEXPORTVA FAR CDECL
#    endif
#  endif
#endif

为:

#  ifdef ZLIB_WINAPI
#    ifdef FAR
#      undef FAR
#    endif
#    include <windows.h>
     /* No need for _export, use ZLIB.DEF instead. */
     /* For complete Windows compatibility, use WINAPI, not __stdcall. */
#    define ZEXPORT WINAPIV
#    ifdef WIN32
#      define ZEXPORTVA WINAPIV
#    else
#      define ZEXPORTVA FAR CDECL
#    endif
#  endif
#endif

编译生成的库为
ZlibStatDebug\zlibstat.lib

ZlibStatRelease\zlibstat.lib。


编译动态库时会出现:error LNK2026 模块对于 SAFESEH 映像是不安全的,解决方法:

1.打开该项目的“属性页”对话框。

2.单击“链接器”文件夹。

3.单击“命令行”属性页。

4.将 /SAFESEH:NO 键入“其他选项”框中,然后点击应用。

出现错误    LNK1118    “VERSION”语句中的语法错误    zlibvc    D:\dev\zlib-1.2.8\contrib\vstudio\vc11\zlibvc.def    4

将zlibvc.def文件的VERSION        1.2.8 这一行注释掉。

写了一个例子想测试一下,结果出现链接错误:
1>unzip.obj : error LNK2019: 无法解析的外部符号_inflateInit2_,该符号在函数_unzOpenCurrentFile3 中被引用
1>unzip.obj : error LNK2019: 无法解析的外部符号_inflate,该符号在函数_unzReadCurrentFile 中被引用
1>unzip.obj : error LNK2019: 无法解析的外部符号_crc32,该符号在函数_unzReadCurrentFile 中被引用
1>zip.obj : error LNK2001: 无法解析的外部符号_crc32
1>unzip.obj : error LNK2019: 无法解析的外部符号_inflateEnd,该符号在函数_unzCloseCurrentFile 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_get_crc_table,该符号在函数_zipOpenNewFileInZip4_64 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_deflateInit2_,该符号在函数_zipOpenNewFileInZip4_64 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_deflate,该符号在函数_zipWriteInFileInZip 中被引用
1>zip.obj : error LNK2019: 无法解析的外部符号_deflateEnd,该符号在函数_zipCloseFileInZipRaw64 中被引用
1>C:\test\testzlib\Debug\testzlib.exe : fatal error LNK1120: 8 个无法解析的外部命令

刚开始百思不得其解,后来用lib命令查看zlibstat.lib的符号,发现其中的函数名称会多一个@,比如
_get_crc_table在lib输出的符号中为_get_crc_table@0
这个肯定是问题所在,在网上看到如下资料:
(http://blog.csdn.net/shifters/article/details/7163844)
C语言通过不同的调用协议来产生修饰名称,当使用__cdecl(C调用协议)时,会在函数名称前加一个下划线,不考虑参数和返回值。使用__fastcall函数,在函数名称前后各加一@符号,后跟参数长度,不考虑返回值。例如extern “C” int __fastcall Test(int n)的修饰名称为@Test@4. 对于使用标准调用协议(__stdcall)的函数,在函数名称前加一下划线,后跟参数长度,不考虑返回值。如extern “C” int __stdcall Test (int n, int m) 的修饰名称为_Test@8

因此再回到zibstat的工程中
发现函数的定义中有ZEXPORT:
比如(zlib.h):
ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table   OF((void));
而ZEXPORT的定义为(zconf.h):
#    define ZEXPORT WINAPI
而WINAPI的定义为(windef.h)
#define WINAPI     __stdcall
因此生成的符号当然有个@加上参数长度了
找到问题后就好解决了,修改函数中ZEXPORT为ZEXPORTVA
#define ZEXPORTVA WINAPIV----->#define WINAPIV    __cdecl
注意需要修改头文件和源代码。

另外
1、发现zlibvc.def文件在静态库中是不起作用的,只对动态库的输出符号有作用,这导致走了一点弯路
2、输出符号的方式,在/contrib/vstudio/vc9/x86/ZlibStatDebug下调用
>"c:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
创建编译环境,然后调用>dumpbin /symbols zlibstat.lib >t1.txt
即可在t1.txt文件中看到符号了。


3、编译zstd

打开 D:\dev\zstd-1.4.9\build\VS2010目录下的zstd.sln

直接编译 libzstd 和libzstd-dll即可。

4、编译librdkafka-1.5.3

打开librdkafka-1.5.3\win32目录下的librdkafka.sln

编译librdkafka和librdkafkacpp。设置librdkafka项目的包含目录、库目录和lib文件名:

libeay32.lib
ssleay32.lib
zlibstat.lib
libzstd_static.lib

先编译librdkafka,再编译 librdkafkacpp。

用VS2019编译librdkafka库相关推荐

  1. VS2019编译MQTT库 C/C++(超详细,含示例工程)

    目录 前言 一.前期准备 1.1 获取mqtt库 1.2 安装openssl 1.3 安装cmake-gui 二.生成C工程代码 三.编译C库 3.1 创建工程目录 3.2 修改输出目录 四.生成C+ ...

  2. 在Windows下使用vs2019编译libjpeg库

    一.库的编译 1.下载 libjpeg 源码,这里我下载的是 jpegsr9e.zip 2.解压源码 3.进入解压后的目录,找到 makefile.vs 文件,用文本编辑器打开并编辑,找到 语句 #! ...

  3. Linux编译librdkafka

    概述 librdkafka是Apache Kafka协议的C库实现,提供Producer.Consumer和Admin客户端. librdkafka开源库的地址 https://github.com/ ...

  4. 用 VS2019 编译带 libx264, libmp3lame 的 FFmpeg 库

    一 前言 上一期,<用 Visual Studio 2019 编译 FFmpeg 简单教程>讲述了,如何用 Visual Studio 2019 编译构建 FFmpeg,用来学习 FFmp ...

  5. VS2019编译 当前最新版chromium

    VS2019编译 当前最新版chromium 之前编译过webrtc和chromium, 由于长时间没用,被我删除了, 最近在最新版本的google浏览器上遇到了播放器兼容性问题,老版本的google ...

  6. 2020-08-03 手动编译Qt库(msvc2019版本)

    Windows下为了编译QtWebEngine组件,必须安装好Windows版本的perl和python2.7.18,QtWebEngine的编译系统并不支持python3.x 使用-static生成 ...

  7. 3D进阶之OSG:从VS2019编译osgEarth开始

    3D库比较多,一般学习的有PCL的VTK,库比较大,集成了相当多不错的算法,对开发水平是个考验:OGRE由于其插件式架构,使得在机器人开发方面应用广泛:相对而言,OSG比较小众,可以用来构建模拟仿真的 ...

  8. SeetaFace2-master在Windows10 VS2019编译的两种方法

    SeetaFace2-master在Windows10 VS2019编译的两种方法 SeetaFace2简介 方法一 方法二 SeetaFace2简介 SeetaFace2 是一个完整的人脸识别项目, ...

  9. Win10中用VS2019编译live555

    前言 说明,本文是在Win10中用VS2019编译live555的过程中,对遇到的问题进行说明.编译过程主要参考的是下面一篇文章,在此表示感谢: https://blog.csdn.net/m0_37 ...

  10. VS2019+QGIS开发库二次开发环境搭建

    VS2019+QGIS开发库二次开发环境搭建 总共分为以下步骤: 下载qgis和二次开发库 VS2019搭建开发环境 配置VS2019中的Qt插件 配置完Qt版本后对工程属性进行配置 编写测试代码 运 ...

最新文章

  1. Oracle NoLogging Append 方式减少批量insert的redo_size
  2. 天命剑之天命的含义--天行有悖,乃命羲和。
  3. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第3章-有向二阶多智能体系统脉冲一致性
  4. idea使用 git 撤销commit
  5. HDU 2065 红色病毒 指数型母函数+泰勒公式
  6. eclipse maven配置_Maven系列教材 (十一)- 使用Eclipse导入一个Maven风格的SSM项目
  7. linux中tomcat日志文件含义
  8. 从零学计算机网络、TCP、IP、路由器、Vlan、HCIA-数通
  9. 干货分享:免费文字转语音工具哪个比较好?
  10. Elaine的oi之路
  11. 人生如梦游戏间,RPG游戏开源开发讲座 JAVA篇 0 ——月晕础润
  12. 苹果手机里微信数据删除怎么恢复?
  13. 学术英语理工(第二版)Unit2课文翻译
  14. linux下线程池实现
  15. 计算机在表格顶端添加标题,电脑Excel表格在打印时怎么设置每页有相同的顶端标题和底端标题...
  16. hive3编译 on tez+tez-ui配置和遇到的兼容问题与踩坑记录
  17. 三星识别文字_三星手机实现音频转文字、文字录入的方法,不知道的看这里!一遍就会了...
  18. 用Javascript 编写 HTML在线编辑器
  19. 颜色帮你缓解职场压力 给你的心情换个色
  20. Java简介和发展史

热门文章

  1. 海康威视摄像头录制的视频无法用PR剪辑
  2. 国内最火的10款Java开源项目,都是国人开发,CMS居多
  3. java 10的 6次方_【Java】 剑指offer(15) 数值的整数次方
  4. Active Directory攻防实验室环境搭建教程(一)
  5. Linux上matlab安装过程,Linux matlab 2010a 下载与安装过程
  6. CAN与CANFD的区别
  7. 最简单的直播礼物连刷特效制作(带源码)
  8. c语言车牌识别原理,解析车牌识别技术,融合多种算法的原理和过程
  9. 什么是ARP协议,如何查看ARP表项、如何配置静态ARP?
  10. UCOSII操作系统(一)--基础知识