Visual Studio中的动态链接

3

我需要动态链接OpenSSL的libeay32.dll库。 我正在使用Visual C++ Express 2008编写本地c++控制台应用程序。

我从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方法?我不知道在哪里指定它的文件名。
5个回答

3

你可能还需要添加一个.lib文件到编译器的链接器输入中。请查阅您使用的库的文档。


3

尝试使用Win32 API的LoadLibrary函数,以下链接可能会有所帮助:示例


3
  1. 如果你的应用程序需要在没有OpenSSL存在的情况下运行,使用显式运行时链接进行动态链接,并处理DLL不存在的情况(例如通过改变应用程序的行为/切换到其他库)。我最近发现了一些很好的例子:
  2. 如果你的应用程序只有在环境中存在OpenSSL(或你提供DLL)时才能运行,请使用隐式运行时链接。
    对于MSVC,最简单的方法是在你的源代码中添加#pragma comment(lib,"libeay32.lib")(你可能需要使用相同编译器生成的.lib存根)
  3. 如果你的应用程序需要独立于环境,请静态链接OpenSSL(也使用.lib)。

请注意,有两种类型的.lib。第一种用于动态但隐式链接,第二种用于静态链接。用于动态隐式链接的那个包含加载DLL的存根,而用于静态链接的那个包含实际实现。


2

4
这并不是真正的静态链接……实际的符号查找和确保调用者指向被调用函数的工作仍然在运行时动态进行。 - sblom
我还有另外两个问题吗?
  1. 我的解决方案中有一个dll项目。为了使其可用,我执行以下操作。右键单击我的exe项目->属性->常规属性->框架和引用->添加新引用->在打开的窗口中,我从列表中选择我的dll项目。一个重要的备注是它不是托管程序集。一切都是本地的。然后我在我的exe项目中包含一个头文件,构建并且一切正常...在这种情况下,VS会如何处理?我能以同样的方式链接到libeay32.dll吗?没有浏览到dll的选项...
- ILya
使用.lib链接后,我能否简单地替换libeay32.dll来更新它?还是我需要重新链接我的项目? - ILya

0

如果您正在从dll中调用方法,则可以使用显式动态链接方法。

错误:您将OpenSSL分发dll中的头文件evp.h包含到了您的项目中

由于您是动态链接,因此无需将A DLL中的.h文件包含到您的项目中。

  • 您可以按照以下方法进行调用:
    1. LoadLibrary("libeay32.dll"); /* 语法: */
    2. 声明一个指向要调用的函数的函数指针。

例如:

假设您的libeay32.dll有一个导出函数:int add(int x, int y);

然后在您的项目中声明一个函数指针,然后调用add方法如下:

    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;
        } 
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接