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的的順序不能寫反了,否則編譯報錯。
示意如下:
win32 {
DEFINES += LIBRDKAFKA_STATICLIB
LIBS += $$PWD/lib/win/librdkafka.a
LIBS += -lws2_32 -lsecur32 -lcrypt32
}
HEADERS += \
$$PWD/config.h \
$$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