Visual Studio中的动态链接

时间:2010-04-13 15:10:56

标签: c++ c visual-studio dll compilation

我必须与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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

  1. 如果您的应用程序需要能够在没有OpenSSL的情况下运行,请使用动态链接explicit run-time linking并处理DLL不在的情况(例如,通过更改应用程序的行为/切换到其他库) 。
    我最近发现了一个很好的例子:
  2. 如果您的应用程序只能在环境中存在OpenSSL(或您发送DLL)的情况下运行,请使用隐式运行时链接。
    对于MSVC,最简单的是在源代码中添加#pragma comment(lib,"libeay32.lib")(您可能需要由您使用的相同编译器生成.lib存根)。
  3. 如果您的应用程序需要独立于环境。静态链接OpenSSL(也使用.lib)。
  4. 请注意,.lib有两种。第一个用于动态但隐式链接,第二个用于静态链接。动态隐式链接的包含为您加载DLL的存根,而静态链接的存根包含实际的实现。

答案 3 :(得分:2)

在项目属性,配置属性,链接器,输入中 - 在“其他依赖项”下添加库名称。

[注意,这实际上会与库链接。如果您真的想要动态加载库,则需要在DLL上调用LoadLibrary(),然后使用GetProcAddress()获取所需函数的函数指针。

参见例如

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

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

答案 4 :(得分:0)

如果从dll调用方法,则可以使用explict动态链接方法。

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

  

当您动态链接时,无需将.d从DLL包含到项目中。

  • 您可以通过以下方式致电:
    1. 的LoadLibrary("的libeay32.dll&#34); / *语法:* /
    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;
        } 
   }