使用hiredis報錯LNK2005

2021-10-11 02:23:09 字數 1245 閱讀 6338

專案的db中使用了redis+python+mysql的儲存方案,在編譯redis庫的時候,win32_interop.lib與專案中原有的net.lib有編譯衝突,net.lib引用了ws2_32.lib,導致tcp的幾個介面bind()、accept()報重複定義的錯誤。

解決方案 :修改了redis的原始碼,hiredis.lib和win32_interop.lib的源**使用了網路介面的地方,都將函式

重新命名了一下,bind()、accept()介面全部加了字尾_redis,再匯出win32_interop.lib後。工程引用新的lib 後,

編譯正常通過。

修改完原始碼以後,工程編譯x64,發現啟動專案後,專案無法正常連線上redis。

原因是呼叫hiredis.lib的redisconnect()介面,其底層還是呼叫tcp的connect()介面。編譯的時候,connect()

函式沒有報錯,我就沒有全部修改,有遺漏。索性把所有網路相關的介面,全部修改後,再編譯hiredis.lib匯出到

工程引用後,問題解決,可以正常連線上redis資料庫。

x64環境下,rediscommand()執行%b引數會報錯 "out of memory",需要將rediscommand()中int型別修改為

size_t型別(還是去修改hiredis的原始碼,然後編譯匯出新的lib檔案)。

size_t能識別x64和win32,在win32下是4位元組,在x64是8位元組。而rediscommand()中%b的長度預設型別是int,

導致在win32下沒有問題,但編譯x64就會報錯。

ycstoragelib編碼問題encode(「utf-8」)表示將資料以utf-8格式,編碼為二進位制資料,decode()函式將二進位制資料解碼為字串。

以utf-8編碼的二進位制資料,解碼也要utf-8格式,否則解析出來的資料會是亂碼。

二進位制資料解碼為json字串,如果json字串中包含\0,ycstoragelib解析會提前截斷,導致資料不對。

解決方案:將二進位制資料解碼的json字串,用base64編碼,然後儲存到redis中。ycstoragelib從redis中取

出base64編碼的字串,用base64解碼還原為字串。再通過rapidjson來解析字串。

Hiredis 基本使用

0.前言 hiredis是乙個redis的c客戶端庫函式,基本實現了redis的協議的最小集。這裡對hiredis的api作基本的介紹以及應用,主要參考hiredis的readme檔案以及相關原始碼。1.同步api rediscontext,該庫的上下文環境。1 context for a conn...

Hiredis 基本使用

0.前言 hiredis是乙個redis的c客戶端庫函式,基本實現了redis的協議的最小集。這裡對hiredis的api作基本的介紹以及應用,主要參考hiredis的readme檔案以及相關原始碼。1.同步api rediscontext,該庫的上下文環境。1 context for a conn...

hiredis使用簡介

hiredis是redis資料庫的c介面,目前只能在linux下使用,幾個基本的函式就可以操作redis資料庫了。一 api簡介 1 rediscontext redisconnect const char ip,int port 類似的提供了乙個函式rediscontext redisconnec...