2010-04-13 83 views
3

我必須與OpenSSL libeay32.dll動態鏈接。 我正在使用Visual C++ Express 2008編寫本機C++控制檯應用程序。在Visual Studio中的動態鏈接

我包含一個來自OpenSSL發行版的頭文件evp.h。建築物和...:

error LNK2001: unresolved external symbol _EVP_aes_256_cbc 
error LNK2001: unresolved external symbol _EVP_DecryptInit 
error LNK2001: unresolved external symbol _EVP_CIPHER_CTX_init 

如何調用libeay32.dll方法?我不知道在哪裏指定它的文件名

回答

2

在項目屬性,配置屬性,鏈接器,輸入 - 在「其他依賴項」下添加庫名稱。

[注意,這實際上會實時與庫鏈接。如果你真的想動態加載庫,你需要在DLL上調用LoadLibrary(),然後使用GetProcAddress()獲取你需要的函數的函數指針。

見例如

http://msdn.microsoft.com/en-us/library/ms886736.aspx

http://msdn.microsoft.com/en-us/library/ms885634.aspx

+3

這不是真正的靜態鏈接...實際的符號查找並確保調用者指向被調用者仍然在運行時動態地發生。 – sblom 2010-04-13 15:53:56

+0

我可以再問兩個問題嗎? 1.我的解決方案中有一個dll項目。要打電話給我,我做了以下。右鍵單擊我的exe項目 - >屬性 - >通用屬性 - >框架&引用 - >添加新引用 - >在打開的窗口中,我從列表中選擇我的dll項目。一個重要的說法,它不是託管程序集。全部是本地的。然後我在我的exe項目中包含一個頭文件,構建和一切都OK ...... VS在這種情況下的行爲如何?我可以以同樣的方式鏈接到libeay32.dll嗎?有沒有選擇瀏覽到DLL ... – ILya 2010-04-14 07:23:15

+0

2.使用.lib鏈接後,我可以簡單地更換libeay32.dll來更新它。或者我將不會鏈接我的項目? – ILya 2010-04-14 07:23:38

3

您可能還需要將.lib文件添加到編譯器的鏈接器輸入中。檢查你正在使用的庫的文檔。

+0

我有一個.LIB文件。但正如我所知它是用於靜態鏈接... – ILya 2010-04-14 07:12:29

3

嘗試使用Win32 API的調用LoadLibrary功能,下面的鏈接可能會有所幫助:example

3
  1. 如果你的應用離子需要能夠在沒有OpenSSL的情況下運行,使用與explicit run-time linking的動態鏈接並處理當DLL不在周圍(例如,通過改變你的應用程序的行爲/切換到其他庫)。
    最近,我發現這是一個很好的例子:
  2. 如果要是在OpenSSL在環境中存在(或你船的DLL)您的應用程序只能運行,使用隱運行時鏈接。
    對於MSVC,最簡單的就是添加#pragma comment(lib,"libeay32.lib")在源代碼中(你可能會需要的.lib存根通過使用相同的編譯器產生)
  3. 如果你的應用需要獨立的環境。靜態鏈接OpenSSL(也使用.lib)。

請注意,有2種.lib。第一個用於動態但隱式鏈接,第二個用於靜態鏈接。用於動態隱式鏈接的包含爲您加載DLL的存根,而用於靜態鏈接的存根包含實際實現。

0

如果您從dll調用方法,則可以使用explict動態鏈接方法。

錯誤:你包含一個頭文件evp。h從OpenSSL發佈DLL到您的項目

當您動態鏈接時,無需將.h從DLL中包含到您的項目中。

  • 您可以通過下面的方法調用:
    1. 調用LoadLibrary( 「的libeay32.dll」);/*語法:*/
    2. 聲明指向要調用的函數的函數指針。

例如,

讓你的libeay32.dll有一個導出函數:int add(int x, int y);

然後調用它在你的項目中聲明函數指針,然後調用方法添加如下:

typedef int (*AddfnPtr)(int num1, int num2); 
    int num1 = 2, num2 = 3 ; 

    HMODULE handle = NULL; 
    handle = LoadLibrary("libeay32.dll"); 

    if (handle != NULL) 
    { 
     AddfnPtr addfnptr = (AddfnPtr)GetProcAddr(handle, NULL); 
     if (addfnptr != NULL) 
     { 
      int res = addfnptr(num1,num2); 
      cout << "res = "<<res; 
     } 
    }