如何将C ++ Builder应用程序拆分为DLL

时间:2012-02-10 13:36:22

标签: debugging dll build c++builder

有几次我被告知我应该考虑将我的应用程序的各个部分拆分为单独的DLL(以加快链接等),并试图弄清楚它是如何工作的。

我知道我需要在我计划使用的每个头文件声明中添加__declspec(dllexport)。这似乎很乏味,但它是可行的。

如何让app + DLL运行?在一个简单的测试项目中,我找到的唯一方法是将DLL从DLL项目的构建输出目录手动复制到exe项目的构建输出目录。我知道我可以设置一个后期构建步骤来执行此操作,但我希望IDE能够通过某种方式自动让应用程序项目在属于同一个项目组时使用DLL项目。

如何调试app + DLL?我看到我可以在Project下指定DLL的主机应用程序 - >选项 - >调试器,但到目前为止,我只能弄清楚如何一次调试一个项目。我真的希望能够在代码库中的任何地方设置断点,并在代码库中的任何地方单步执行(而不是在项目边界停止),我无法弄清楚如何做到这一点。

1 个答案:

答案 0 :(得分:3)

  

我知道我需要在每个标头中添加__declspec(dllexport)   我计划使用的文件声明。这似乎很乏味,但确实如此   可行的。

你应该做的是在DLL的头文件中创建一个#define,当DLL项目编译头时映射到dllexport,并在其他项目中编译时映射到dllimport。例如:

#ifndef MyDLLH
#define MyDLLH

#ifdef _BUILDING_DLL_
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

MY_EXPORT type callingconvention SomeFunc(parameters);
#ifdef __cplusplus
}
#endif

#endif

然后,您可以在DLL项目中定义_BUILDING_DLL_,无论是在项目选项的条件列表中,还是在头文件的任何#include语句上方的代码中,例如:

#define _BUILDING_DLL_
#include "MyDll.h"
  

如何让app + DLL运行?

DLL项目生成.lib文件,该文件用于静态链接到DLL的导出函数。您可以将.lib文件添加到EXE项目中,然后像任何其他函数调用一样调用DLL函数。或者,您可以使用Win32 API LoadLibrary()和GetProcAddress()函数在运行时动态加载DLL函数,在这种情况下,您根本不使用.lib文件。

  

在一个简单的测试项目中,我找到的唯一方法是工作   手动将DLL从DLL项目的构建输出目录复制到   exe项目的构建输出目录。

EXE的文件夹是操作系统查找DLL的第一个位置,但它不是操作系统可以看到的唯一位置。 MSDN记录了DLL在运行时的位置:

Dynamic-Link Library Search Order

  

我知道我可以设置一个后期构建步骤来做到这一点,但我希望能做到这一点   IDE有一些方法来自动化让app项目使用DLL   当他们成为同一个项目组的一部分时进行项目。

仅仅参与同一个项目组是不够的。这些项目是相互独立编译的。但是,您可以将DLL项目设置为EXE项目的依赖项(或者只是确保DLL项目在构建顺序上高于EXE项目),因此首先编译DLL,然后使用DLL的PostBuild事件移动在需要的地方编译.lib和.dll二进制文件,最后将DLL的编译.lib文件添加到EXE项目中,以便在运行时使用DLL。

  

如何调试app + DLL?

您有几个选择:

要自行调试DLL,将DLL项目加载到IDE中,进入Run参数,并在Host应用程序中设置已编译的EXE。然后,您可以像运行EXE项目一样运行DLL项目。 EXE将被执行,调试器将在加载到内存后附加到DLL。

要同时调试两个项目,请将EXE项目加载到IDE中,并确保在项目选项的Debug Souce路径中指定DLL的源文件夹。然后,您可以正常运行EXE项目,在调用它们时进入DLL函数,在DLL的源代码中设置断点等。