win下qt编译librdkafka

windows 下使用 Qt 的 mingw81_64 编译 librdkafka , 生成静态库。
librdkafka版本v1.8.2, 源码地址: https://gitee.com/dhz120/librdkafka.git

编译

  1. 下载源码,解压
  2. 在Qt Creator中加载源码:文件->打开文件或项目->找到librdkafka根目录下的CMakeLists.txt
  3. 此时,直接编译的话,生成的是动态库。如果需要静态库,需要修改根目录的CMakeLists.txt, 将RDKAFKA_BUILD_STATIC设置为ON,示意如下:
#option(RDKAFKA_BUILD_STATIC "Build static rdkafka library" OFF)
option(RDKAFKA_BUILD_STATIC "Build static rdkafka library" ON)

注意:

  1. 如果之前编译过动态库,修改完上边宏定义之后,需要将build目录的内容手动删掉后,重新编译,才会生成对应的静态库。
  2. librdkafka会自动识别本机有没有装openssl, 如果装了,则编辑的库中包含ssl部分,否则没有。
  1. 编译完成之后,会在build-librdkafka-xxx/src下生成静态库librdkafka.a

会在 build-librdkafka-xxx/generated下生成config.h,这里边包含各种宏定义,使用静态库的时候需要把这个头文件也导入进来。(不确定有没有用

静态库的使用

在pro/pri中导入静态库,需要注意:

  1. 增加宏定义 LIBRDKAFKA_STATICLIB
  2. 导入静态库 LIBS += 静态库位置
  3. 导入其他依赖库 LIBS += -lws2_32 -lsecur32 -lcrypt32
  4. 导入头文件:config.hrdkafka.h

注意:2和3的的顺序不能写反了,否则编译报错。

示意如下(含win/linux):

DEFINES += LIBRDKAFKA_STATICLIB

win32 {
LIBS += $$PWD/lib/win/librdkafka.a
LIBS += -lws2_32 -lsecur32 -lcrypt32

} else {
LIBS += $$PWD/lib/linux/librdkafka.a
LIBS += -lpthread -ldl -lz -lssl -lcrypto
}

HEADERS += \
    $$PWD/rdkafka.h

遇到的问题

  1. undefined reference to __imp_rd_kafka_xxx, 原因:pro/pri中只导入的静态库,即只写了LIBS += $$PWD/lib/win/librdkafka.a
  2. undefined reference to __imp_ioctlsocket, 原因,没有加入其他依赖, 即没写LIBS += -lws2_32 -lsecur32 -lcrypt32
  3. 程序运行起来之后,能创建topic, 但是不能收发消息,可能是集群中kafka的配置设置的是master/slaver1之类的,没用实际的地址。这时候需要修改本机hosts文件,添加对应的映射。参考如下:
    hosts路径:C:\WINDOWS\system32\drivers\etc\hosts
# 添加如下映射
192.168.100.250 master
192.168.100.201 slaver1
192.168.100.202 slaver2
  1. linux下编译遇到问题:
  • undefined reference to crc32, 解决办法:LIBS += -lz
  • undefined reference to BIO_new_mem_buf, 解决办法:LIBS += -lssl -lcrypto

你可能感兴趣的:(win下qt编译librdkafka)