
编译好的文件下载librdkafka-1.5.3.zip_rdkafka32位-桌面系统文档类资源-CSDN下载Librdkafka依赖于zlib、Zstd和OpenSSL库编译之前要先编译这三个库本文只编译32位版本64位编译方法类似。各库版本为zlib-1.2.8zstd-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 。下载所需工具PerlDownload Install Perl - ActiveStateNASMhttps://www.nasm.us/pub/nasm/releasebuilds/2.14rc15/win64/nasm-2.14rc15-installer-x64.exeOpenSSLhttps://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.plMINFOperl util\mk1mf.pl nasm VC-WIN32ms\nt.makperl util\mk1mf.pl dll nasm VC-WIN32ms\ntdll.makperl util\mk1mf.pl nasm BC-NTms\bcb.makperl util\mkdef.pl32libeayms\libeay32.defperl util\mkdef.pl32ssleayms\ssleay32.def修改为perl util\mkfiles.plMINFOperl util\mk1mf.pl nasmdebugVC-WIN32ms\nt.makperl util\mk1mf.pl dll nasmdebugVC-WIN32ms\ntdll.makperl util\mk1mf.pl nasm BC-NTms\bcb.makperl util\mkdef.pl32libeayms\libeay32.defperl util\mkdef.pl32ssleayms\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是编译为动态库本例使用静态库。根目录下的zconf.h 文件需要修改# 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 ZEXPORTWINAPI# 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 这一行注释掉。写了一个例子想测试一下结果出现链接错误1unzip.obj : error LNK2019:无法解析的外部符号_inflateInit2_该符号在函数_unzOpenCurrentFile3中被引用1unzip.obj : error LNK2019:无法解析的外部符号_inflate该符号在函数_unzReadCurrentFile中被引用1unzip.obj : error LNK2019:无法解析的外部符号_crc32该符号在函数_unzReadCurrentFile中被引用1zip.obj : error LNK2001:无法解析的外部符号_crc321unzip.obj : error LNK2019:无法解析的外部符号_inflateEnd该符号在函数_unzCloseCurrentFile中被引用1zip.obj : error LNK2019:无法解析的外部符号_get_crc_table该符号在函数_zipOpenNewFileInZip4_64中被引用1zip.obj : error LNK2019:无法解析的外部符号_deflateInit2_该符号在函数_zipOpenNewFileInZip4_64中被引用1zip.obj : error LNK2019:无法解析的外部符号_deflate该符号在函数_zipWriteInFileInZip中被引用1zip.obj : error LNK2019:无法解析的外部符号_deflateEnd该符号在函数_zipCloseFileInZipRaw64中被引用1C:\test\testzlib\Debug\testzlib.exe : fatal error LNK1120: 8个无法解析的外部命令刚开始百思不得其解后来用lib命令查看zlibstat.lib的符号发现其中的函数名称会多一个比如_get_crc_table在lib输出的符号中为_get_crc_table0这个肯定是问题所在在网上看到如下资料C与C的名称修饰符_shifters的博客-CSDN博客_c C语言通过不同的调用协议来产生修饰名称当使用__cdeclC调用协议时会在函数名称前加一个下划线不考虑参数和返回值。使用__fastcall函数在函数名称前后各加一符号后跟参数长度不考虑返回值。例如extern “C” int __fastcall Test(int n)的修饰名称为Test4.对于使用标准调用协议__stdcall的函数在函数名称前加一下划线后跟参数长度不考虑返回值。如extern “C” int __stdcall Test (int n, int m)的修饰名称为_Test8因此再回到zibstat的工程中发现函数的定义中有ZEXPORT比如zlib.hZEXTERN 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.libssleay32.libzlibstat.liblibzstd_static.lib先编译librdkafka再编译 librdkafkacpp。