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的的順序不能寫反了,否則編譯報錯。

示意如下:

win32 {
DEFINES += LIBRDKAFKA_STATICLIB

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

HEADERS += \
    $$PWD/config.h \
    $$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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章