【问题标题】:How to split a C++Builder app into DLLs如何将 C++Builder 应用程序拆分为 DLL
【发布时间】:2012-02-10 13:36:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: debugging dll build c++builder


    【解决方案1】:

    我知道我需要将 __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"
    

    如何让应用程序 + 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 有一些方法可以自动让应用程序项目使用 DLL 当他们属于同一个项目组时进行项目。

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

    如何调试应用程序 + DLL?

    你有几个选择:

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

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

    【讨论】:

    • 我发现需要同时调试两个项目的一个额外步骤:将.tds文件(调试器符号)从DLL输出目录复制到.dll文件所在的位置应用程序的使用。
    • @Josh-Kelley:如果我将.exe 项目的“工作目录”设置为包含.dll.tds 文件的路径,我就能够在不复制的情况下调试两者。在 C++Builder XE 下,“工作目录”选项位于 Project Options>Debugger 下。
    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多