1

我假设如果我收到第 3 方 DLL,我还应该收到以下内容:

1) 带有函数原型的标头

2) 静态链接库或导入库(与 DLL 相同的基本名称,但扩展名为 .LIB)

我的困惑是我不明白如何将一个 Dll 链接到另一个 C++ DLL 项目并构建它以正确链接依赖项。我从哪里得到函数原型?对于我的 DLL 项目,我使用的是 .DEF 文件,而不是使用 __declspec(dlliexport)。将 DLL 链接到我的 C++ DLL 项目的绝对最低要求是什么?

我知道当前的共识(以及我对 SOF 的研究)是:

1) 包含获得外部函数原型的第 3 方头文件(我没有)。2) 通过项目属性表添加 .LIB 文件(在 Visual Studio 2010 中)。

这是要走的路吗?我需要将 DLL 复制到可执行文件夹吗?正确的程序是什么?当我自己尝试这样做时,有人可以帮助我吗?

更新

DLL_A.h

extern void this_is_dll_A(void); // Prints DLL_A

DLL_A.c

#include <stdio.h>
#include "Dll_A.h"

void this_is_dll_A(void)
{
printf("THIS IS DLL A\n\n\n");
}

我将以下 def 文件用于 Dll_A 项目

LIBRARY Dll_A
EXPORTS
    this_is_dll_A @1

DLL_B.h

#include "Dll_A.h"

extern void this_is_dll_B(void); 

我在属性表中添加了 Dll_A.h 头文件的包含文件夹。此外,链接器选项中的 .lib 文件和包含文件夹。但没有 DLL。

DLL_B.c

#include <stdio.h>
#include "Dll_B.h"


void this_is_dll_B(void)
{
printf("This is dll B...and...\n\n");
this_is_dll_A();
}

我为我的 Dll_B 项目使用 d_b.def 文件

LIBRARY Dll_B
EXPORTS
this_is_dll_B @1

没有进口?!不确定这是否正确。

在我的 Dll_B 项目中,我不会将我的文件复制Dll_A.dllDebug许多网站包含 SOF 建议的文件夹中。

它构建良好。问题是我不确定我是否可以/应该在没有头文件的情况下这样做。另外,如果我要将 Dll_B 链接到 VS2010 中的可执行应用程序项目,我应该怎么做。

4

1 回答 1

1

您描述的构建过程是正确的 - 将 DLL 与第二个 DLL 的导入库链接。至于运行时,两个 DLL 都需要在 DLL 搜索路径(PATH 环境变量)中或与 exe 位于同一目录中。如果未找到 DLL,您的应用程序将不会加载。

还有另一种使用 LoadLibrary 函数加载 DLL 的方法。在这种情况下,您无需链接导入库,而必须通过 GetProcAddress 手动映射所有 DLL 导入。此方法用于插件 - 所有 DLL 都具有已知的公开接口。

于 2013-11-27T10:56:04.323 回答