预处理器`_AFXDLL'是什么意思?

时间:2016-11-04 08:13:52

标签: c++ dll mfc

我已经搜索过,但没有找到有意义的解释,比如效果和机制,所以我能理解它。一个有用的解释"的例子,有很多材料在线解释_DEBUG预处理器,如何打开它将允许assert等。

MSDN第1页Building Settings for an MFC DLL for Visual Studio 6.0表示这不适用于1)常规DLL,静态链接到MFC需要,但需要2)常规DLL,使用共享MFC DLL,或3)扩展DLL。但是没有进一步的解释。

MSDN第2页AFXDLL Versions简要提及:

  

而不是通过静态链接到MFC来构建应用程序   对象代码库,您可以构建您的应用程序以使用其中一个   AFXDLL库,它包含多个运行的DLL中的MFC   应用程序可以共享有关AFXDLL名称的表,请参阅DLL:命名   约定。

     

注意:默认情况下,MFC应用程序向导会创建AFXDLL   项目。要改为使用MFC代码的静态链接,请设置使用MFC   MFC应用程序向导中的静态库选项。静态链接   在Visual C ++标准版中不可用。

,但我甚至不确定此AFXDLL是否与_AFXDLL预处理器相关。

Stackoverflow帖子Unexplainable error "Please use the /MD switch for _AFXDLL builds"#error Please use the /MD switch for _AFXDLL builds说明/MT/MTd_AFXDLL冲突,但这与MSDN第1页相同,没有任何内容新。

有人可以解释

  • _AFXDLL预处理器是什么意思?最初的动机?
  • 它如何影响编译或链接?
  • 它已经过时了吗?
  • 是与_AFXDLL库相关的AFXDLL预处理器吗?实际上,这就是所谓的" AFXDLL库"?

1 个答案:

答案 0 :(得分:13)

MSVC ++为希望仅部署单个可执行文件的程序员提供优化。您可以使用/ MT构建以将C运行时库和标准C ++库链接到EXE中。您可以链接静态MFC库以将MFC链接到EXE。小型LOB应用并不罕见。

很好,但是当您还使用DLL来模块化或共享代码或支持更快的构建时间时,这无法正常工作。 MFC(和CRT)有很多全局状态,CWinApp单例就是一个很好的例子。 C ++程序不能在像Java或C#应用程序这样的VM中运行,一个模块必须负责存储该全局状态。其他模块必须使用该模块的全局变量,而不是自己的模块。因此,您必须使用MFC的DLL版本和C和C ++运行时库的DLL版本,并链接其导入库,他们承担这一责任。

你必须告诉编译器它,以便库将寻找那些全局变量的正确位置。这需要#defining _AFXDLL。读它就像“应用程序框架存在于自己的DLL中”。 CRT也有一个宏,它是_DLL

请注意,这在IDE中是完全自动的。项目>属性>一般,“使用MFC”设置。如果您为此设置选择“在共享DLL中使用MFC”,那么您将自动定义_AFXDLL。同样适用于CRT。