文章來源:http://blog.sina.com.cn/s/blog_731bf4c90102wnpr.htmlhtml
本文僅是我的經驗總結,如有錯誤歡迎指教!c++
最近要作一個跨平臺的項目,同時也涉及到網絡數據傳輸,因此考慮採用Qt和Libevent。緩存
1.vs編譯libeventcookie
參考網上衆多經過VS編譯Libevent的文章(http://www.cnblogs.com/luxiaoxun/p/3603399.html),成功編譯獲得了libevent.lib、libevent_core.lib、libevent_extras.lib這三個靜態庫。網絡
2.Qt工程中添加Libevent靜態庫dom
新建了一個QT工程(路徑爲E:\LibeventCaster),建立路徑E:\LibeventCaster\libevent_include\event2,存放libevent庫的include和WIN32_Code文件夾下的全部.h文件。在QT工程的生成目錄(本文中是E:\LibeventCaster-build-desktop)中建立路徑E:\LibeventCaster-build-destop\libevent_lib,存放上面編譯獲得的libevent.lib等三個靜態庫。在.pro文件(路徑爲E:\LibeventCaster)中添加頭和庫的路徑,以下所示:工具
INCLUDEPATH += ./libevent_include ui
LIBS += -L./libevent_lib -llibevent -llibevent_core -llibevent_extras.net
其中INCLUDEPATH語句添加.h頭文件路徑,在程序中經過#include 添加libevent的頭,LIBS語句添加lib靜態庫文件路徑,-L表明是靜態庫,後面無空格,緊跟靜態庫路徑,-l(小寫L)後面緊跟靜態庫名稱(省略.lib),多個-l添加多個靜態庫。htm
注意:1)lib庫是存放在生成目錄-build-desktop下的,不然會提示找不到libevent.lib。
2)若是程序中使用了WSAStartup,須要添加ws2_32.lib庫,以下所示。
LIBS += -lws2_32
3)個人QT最開始使用的是mingw編譯器,而libevent.lib三個靜態庫是用vc++編譯器編譯的,在qt中使用Libevent的時候會出現security_cookie等相似的錯誤,在網上找了好久,說是bufferoverflow的問題,讓加載bufferoverflowU.lib庫,可是錯誤未解決。又考慮mingw靜態庫是.a後綴,因此經過reimp和rs兩條語句將lib轉爲a,(http://blog.sina.com.cn/s/blog_731bf4c90102wnn4.html)但錯誤仍未解決,看來不是後綴名的問題了,考慮仍是編譯器不一致的問題,VC++編譯中使用了緩存溢出的一些東西,而mingw中沒有,因爲本人不知道如何用mingw來編譯libevent.lib(汗顏),因此採用笨辦法,設置Qt在Windows平臺下的編譯器爲vc++,這樣二者一致起來,錯誤果真解決了,設置方法以下。
工具——選項——Qt4,設置Qt的版本(個人安裝版本是qt-win-opensource-4.8.2-vs2008,安裝路徑D:\Qt\4.8.2),qmake路徑爲D:\Qt\4.8.2\bin\qmake.exe,工具鏈會自動加載vc++編譯器。
4)用上面的方法又出現新的錯誤 __imp__CryptGenRandom,網上搜索說缺乏AdvAPI32.lib庫,因此按照以下方法添加庫,錯誤解決,程序編譯成功。
LIBS += -lAdvAPI32
http://blog.csdn.net/libaineu2004/article/details/53224099