2011-12-22 85 views
1

在開始這個項目之前,我產生了精通編碼和使用Visual Studio 2010的錯誤印象。我意識到現在我已經處於完全自我的狀態。如何將我的MS Visual Studio項目與OpenSSL靜態庫鏈接?

我的平臺是開發盒是64位Windows 7,但我需要爲64和32位平臺構建。我使用VS 2010和OpenSSL 1.0.0e,但如果需要的話,我可以使用另一個。我正在嘗試創建一個靜態庫(* .lib),該庫將被其他開發人員包含在一個更大的項目中。 * .lib似乎可以編譯,但顯然事情並不是很好,因爲測試程序中斷。

我不能在我的程序中使用* .dlls,這個來自高位,因此我一直試圖將我的庫靜態鏈接到libeay32.lib和ssleay32.lib。我纔剛剛開始,喜歡慢開始使用新的東西的時候,所以只有兩個功能,我想從SSL調用是HMAC和EVP_sha512:

HMAC(EVP_sha512(), key, keyLen, lpBufferAddr, dwCurBufSize, hashOut, &len);

我承認我會那樣做完全錯誤,但你有它。說實話,我唯一需要的就是密碼功能和HMAC功能。我可能可以使用別的東西,但我被告知使用OpenSSL。無論如何,繼續前進....

當建立一個鏈接到我的庫項目的測試程序(這反過來又鏈接到兩個OpenSSL庫),我得到以下鏈接錯誤:

error LINK2019: unresolved external symbol [email protected] referenced in function "public: int _thiscall etc" 
error LINK2019: unresolved external symbol [email protected] referenced in function "public: int _thiscall etc" 

我將這兩個庫都包含在「附加依賴項」中,並將其目錄包含在「附加庫依賴項」中。

任何人都可以幫助我嗎?我一直在傾訴這一點,並得出了不幸的結論,我是一個笨蛋。我承認,從OpenSSL創建靜態庫很困難,我甚至不相信我用x64取得了成功。任何幫助和建議將不勝感激。

回答

0

OpenSSL是基於C語言的庫,使用/ Gd選項進行編譯。所有的函數都使用__cdecl調用約定。

在您正在使用的功能之前添加__cdecl。 (請注意,添加__cdecl後不需要重新編譯庫,因爲該庫是使用此選項編譯的)。

例如如果你正在使用SSL_connect

int __cdecl SSL_connect(SSL * ssl); 

我想,它會解決你的問題。

在少數情況下,很多情況下需要將函數聲明包裝在extern「C」下。但據我所知,在這種情況下,你不應該這樣做。

相關問題