我知道我需要将 __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源代码中设置断点等。