Debugging 如何拆分C++;将Builder应用程序导入DLL 我曾多次被告知,我应该考虑将我的应用程序的部分分割成单独的DLL(以加快链接等),并且我试图弄清楚它是如何工作的。

Debugging 如何拆分C++;将Builder应用程序导入DLL 我曾多次被告知,我应该考虑将我的应用程序的部分分割成单独的DLL(以加快链接等),并且我试图弄清楚它是如何工作的。,debugging,dll,build,c++builder,Debugging,Dll,Build,C++builder,我知道我需要在计划使用的每个头文件声明中添加\uu declspec(dllexport)。这看起来很乏味,但它是可行的 如何让应用程序+DLL运行?在一个简单的测试项目中,我发现唯一有效的方法是手动将DLL从DLL项目的生成输出目录复制到exe项目的生成输出目录。我知道我可以设置一个后期构建步骤来实现这一点,但是我希望IDE能够有一些方法来自动让一个应用程序项目在属于同一个项目组时使用DLL项目 如何调试应用程序+DLL?我看到了可以在Project->Options->Debugger下为D

我知道我需要在计划使用的每个头文件声明中添加
\uu declspec(dllexport)
。这看起来很乏味,但它是可行的

如何让应用程序+DLL运行?在一个简单的测试项目中,我发现唯一有效的方法是手动将DLL从DLL项目的生成输出目录复制到exe项目的生成输出目录。我知道我可以设置一个后期构建步骤来实现这一点,但是我希望IDE能够有一些方法来自动让一个应用程序项目在属于同一个项目组时使用DLL项目

如何调试应用程序+DLL?我看到了可以在Project->Options->Debugger下为DLL指定主机应用程序的位置,但到目前为止,我只能一次调试一个项目。我真的希望能够在代码库中的任何位置设置断点,并在代码库中的任何位置单步执行(而不是在项目边界处停止),但我不知道如何做到这一点

我知道我需要向每个标头添加u 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 u,可以在项目选项的条件列表中,也可以在头文件的任何#include语句上方的代码中,例如:

#define _BUILDING_DLL_
#include "MyDll.h"
如何让应用程序+DLL运行

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

在一个简单的测试项目中,我发现唯一可行的方法是 手动将DLL从DLL项目的生成输出目录复制到 exe项目的生成输出目录

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

我知道我可以设置一个后期构建步骤来实现这一点,但我希望 IDE可以通过某种方式自动让应用程序项目使用DLL 当他们属于同一个项目组时进行项目

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

如何调试应用程序+DLL

您有两个选择:

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


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

我发现同时调试两个项目所需的另一个步骤:复制
.tds
文件(调试器符号)从DLL输出目录到
.DLL
文件将驻留以供应用程序使用的任何位置。@Josh Kelley:如果我将
.exe
项目的“工作目录”设置为包含
.DLL
.tds
文件的路径,我就能够在不复制的情况下调试这两个文件。在C++Builder XE下,可以在项目选项>调试器下找到“工作目录”选项。