【问题标题】:What does preprocessor `_AFXDLL` mean?预处理器`_AFXDLL`是什么意思?
【发布时间】:2017-03-18 00:13:14
【问题描述】:

我已经搜索但没有找到有意义的解释,比如效果是什么,机制,所以我可以理解它。一个“有意义的解释”的例子,网上有不少资料解释_DEBUG预处理器,如何打开它会允许assert等等。

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

MSDN page #2 AFXDLL Versions 简要提及:

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

注意:默认情况下,MFC 应用程序向导会创建一个 AFXDLL 项目。要改为使用 MFC 代码的静态链接,请将 Use 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 库”是什么?

【问题讨论】:

  • 只是一个有根据的猜测:当您针对 AFXDLL 进行编译时,编译器不是定义了 _AFXDLL 吗?这样您就可以添加与目标相关的功能。
  • 什么是 AFXDLL?
  • 如文档所述,当您使用 MFC 库时,您可以将它们静态链接到您的可执行文件,也可以从共享 DLL 中使用它们。通过 AFXDLL 构建,您将在共享 DLL 中使用它们。
  • "来自共享 DLL"... 哪个 DLL?如果我不是在开发DLL,而是EXE,我应该设置_AFXDLL吗?
  • 这个概念是当你使用一个库时,会有很多你已经实现的编译代码。例如,当您使用 MFC 类时,它们将在某处实现,而不是在 您的 代码中。这些实现必须与您的可执行文件链接才能工作。您可以通过不同的方式实现此目的,一种方法是将 MFC 代码与您的可执行文件静态链接,这意味着编译后的代码将添加到您的 exe 中并成为其中的一部分。您可以使用您正在使用的 MFC 代码发送您的 exe。

标签: c++ dll mfc


【解决方案1】:

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 也一样。

【讨论】:

  • 这在 IDE 中是完全自动的吗?在项目 > 属性 > 常规,“使用 MFC”设置中,我选择“在共享 DLL 中使用 MFC”,但我仍然没有看到在项目 > 属性 > C/C++ > 预处理器下定义的_AFXDLL?跨度>
  • 您必须深入了解一下,它是从项目属性表继承的。在 VS2015 中单击设置的下拉按钮,编辑,显示在“继承的值”框中。它在 C/C++ > 命令行 > 所有选项框中也可见。
猜你喜欢
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多