我搜索过但没有找到有意义的解释,比如效果,机制,所以我能理解它."有意义的解释"的一个例子,在网上有很多材料解释_DEBUG预处理器,如何打开它将允许assert等.
MSDN第1页用于Visual Studio 6.0的MFC DLL的构建设置说这不适用于1)常规DLL,静态链接到MFC需要,但需要2)常规DLL,使用共享MFC DLL,或者,3)扩展DLL .但是没有进一步的解释.
MSDN第2页AFXDLL版本简要提及:
您可以构建应用程序以使用其中一个AFXDLL库,而不是通过静态链接到MFC对象代码库来构建应用程序,这些库包含多个正在运行的应用程序可以共享的DLL中的MFC.有关AFXDLL名称的表,请参阅DLL:命名约定.
注意:默认情况下,MFC应用程序向导会创建AFXDLL项目.若要使用MFC代码的静态链接,请在MFC应用程序向导中的"在静态库中使用MFC"选项.静态链接在Visual C++标准版中不可用.
,但我甚至不确定这AFXDLL是否与_AFXDLL预处理器有关.
Stackoverflow post 无法解释的错误"请使用/ MD开关进行_AFXDLL构建"和#error请使用/ MD开关为_AFXDLL构建说明/MT或/MTd与之冲突_AFXDLL,但这与MSDN页面#1相同,没什么新内容.
有人可以解释一下
_AFXDLL预处理器是什么意思?最初的动机?_AFXDLL预处理器与AFXDLL库有关吗?实际上,这个所谓的"AFXDLL库"是什么?Han*_*ant 14
MSVC++为只想部署单个可执行文件的程序员提供了优化.您可以使用/ MT构建以将C运行时库和标准C++库链接到EXE中.您可以链接静态MFC库以将MFC链接到EXE.小型LOB应用并不罕见.
很好,但是当你还使用DLL来模块化或共享你的代码或者更快的构建时间时,它就无法正常工作.MFC(和CRT)有很多全局状态,CWinApp单例就是一个很好的例子.C++程序不能像Java或C#应用程序那样运行,其中一个模块必须负责存储该全局状态.其他模块必须使用该模块的全局变量,而不是自己的模块.因此,您必须使用MFC的DLL版本和C和C++运行时库的DLL版本,并链接其导入库,他们承担这一责任.
而且你必须告诉编译器它,以便库将寻找那些全局变量的正确位置.这需要#defining _AFXDLL.读它就像"应用程序框架存在于自己的DLL中".CRT也有一个宏,它是_DLL.
请注意,这在IDE中是完全自动的.项目>属性>常规,"使用MFC"设置.如果您为此设置选择"在共享DLL中使用MFC",那么您将自动_AFXDLL定义.同样适用于CRT.
| 归档时间: |
|
| 查看次数: |
4475 次 |
| 最近记录: |