将DLL链接到另一个DLL的正确过程

时间:2013-10-14 22:43:46

标签: c++ c dll linker static-libraries

我认为如果我收到第三方DLL,我还应该收到以下内容:

1)具有函数原型的标题

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

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

我知道目前的共识(以及我在SOF中的研究)是:

1)包含已获得外部函数原型的第三方头文件(我没有它们)。 2)通过Project Property表(在Visual Studio 2010中)添加.LIB文件。

这是要走的路吗?我需要将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");
}

我对Dll_A项目使用以下def文件

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头文件的include文件夹。此外,.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();
}

我将d_b.def文件用于我的Dll_B项目

LIBRARY Dll_B
EXPORTS
this_is_dll_B @1

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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