2010-04-13 85 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; 
     } 
    }