windows 下使用 Qt 的 mingw81_64 编译 librdkafka , 生成静态库。
librdkafka版本v1.8.2, 源码地址: https://gitee.com/dhz120/librdkafka.git
编译
- 下载源码,解压
- 在Qt Creator中加载源码:
文件->打开文件或项目->找到librdkafka根目录下的CMakeLists.txt
- 此时,直接编译的话,生成的是动态库。如果需要静态库,需要修改根目录的
CMakeLists.txt
, 将RDKAFKA_BUILD_STATIC
设置为ON
,示意如下:
#option(RDKAFKA_BUILD_STATIC "Build static rdkafka library" OFF)
option(RDKAFKA_BUILD_STATIC "Build static rdkafka library" ON)
注意:
- 如果之前编译过动态库,修改完上边宏定义之后,需要将build目录的内容手动删掉后,重新编译,才会生成对应的静态库。
- librdkafka会自动识别本机有没有装openssl, 如果装了,则编辑的库中包含ssl部分,否则没有。
- 编译完成之后,会在
build-librdkafka-xxx/src
下生成静态库librdkafka.a
。
会在
build-librdkafka-xxx/generated
下生成config.h
,这里边包含各种宏定义,使用静态库的时候需要把这个头文件也导入进来。(不确定有没有用)
静态库的使用
在pro/pri中导入静态库,需要注意:
- 增加宏定义
LIBRDKAFKA_STATICLIB
- 导入静态库
LIBS += 静态库位置
- 导入其他依赖库
LIBS += -lws2_32 -lsecur32 -lcrypt32
- 导入头文件:
config.h
和rdkafka.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
遇到的问题
- undefined reference to __imp_rd_kafka_xxx, 原因:pro/pri中只导入的静态库,即只写了
LIBS += $$PWD/lib/win/librdkafka.a
- undefined reference to __imp_ioctlsocket, 原因,没有加入其他依赖, 即没写
LIBS += -lws2_32 -lsecur32 -lcrypt32
- 程序运行起来之后,能创建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
- linux下编译遇到问题:
- undefined reference to crc32, 解决办法:
LIBS += -lz
- undefined reference to BIO_new_mem_buf, 解决办法:
LIBS += -lssl -lcrypto