C++ 为什么是;在静态库中使用MFC“;使用VS 2008构建DLL时未遵循设置?

C++ 为什么是;在静态库中使用MFC“;使用VS 2008构建DLL时未遵循设置?,c++,windows,visual-c++,visual-studio-2008,mfc,C++,Windows,Visual C++,Visual Studio 2008,Mfc,我的目标是创建一个MFC/C++DLL,它除了基本的Win32 DLL之外没有任何依赖项。因此,我在项目属性->常规->中选择了“在静态库中使用MFC”设置 但是,当我构建此DLL并使用依赖项Walker检查结果时,我得到以下结果: 显示对以下MFC DLL的依赖关系: MFC90U.DLL MSVCR90.DLL MSVCP90.DLL 那么我做错了什么 另外,我正在使用VisualStudio2008,我想我明白了。把我搞砸的是C++->代码生成中的项目设置->运行库。将其更改为多线程

我的目标是创建一个MFC/C++DLL,它除了基本的Win32 DLL之外没有任何依赖项。因此,我在项目属性->
常规->
中选择了
“在静态库中使用MFC”
设置

但是,当我构建此DLL并使用
依赖项Walker
检查结果时,我得到以下结果:

显示对以下MFC DLL的依赖关系:

MFC90U.DLL
MSVCR90.DLL
MSVCP90.DLL
那么我做错了什么


另外,我正在使用VisualStudio2008,我想我明白了。把我搞砸的是
C++
->
代码生成中的项目设置
->
运行库
。将其更改为
多线程DLL(/MD)
,然后将以下内容添加到
stdafx.h
文件中:

#define _AFXDLL

因此,为了使其静态链接到MFC库,我必须将第一个设置更改为
多线程(/MT)
,并注释掉第二个设置。

是否启用了增量链接?重建是否都有帮助?
MSVCR90.DLL
MSVCP90.DLL
不是MFC二进制文件。@IInspectable:老实说,我从来没有想过。但是,如果您构建项目以使用“MFC作为共享DLL”,则这些文件将包括在内。默认情况下,它们也不包括在Windows XP安装(甚至可能是Vista)中,因此必须通过MSI(和“DLL地狱”)分发。正确,运行时支持库是VS 2008中编译器的一部分,而不是操作系统的一部分。这只在Windows 10中发生了变化,Windows 10是操作系统的一部分。希望您现在了解如何应用于您的情况。通过对CRT进行静态链接,您无法再安全地跨DLL边界传递CRT对象(例如内存)。@IInspectable:但愿如此。我不会让CRT对象跨DLL边界传递。我使用原语类型、内存缓冲区指针或
Heap
分配内存来实现这一点。总的来说,我的大部分代码都使用Win32 API。CRT只是模块内部的最后手段。另一方面,链接到MFC DLL是最糟糕的事情。我去过那里,做过那件事。不要了!您实际上依赖于用户在System32文件夹中的“任何状态”DLL。最好去死吧!嗯。。。不,您需要部署依赖项。进入应用程序的安装目录。如果你用正确的方式做事,就没有地狱。这在下有记录。与CRT一样,针对MFC库的动态链接给您留下了一些选项,否则这是不可能的。请注意,使用动态链接的CRT也不能完全解决在DLL边界之间传递CRT对象的问题-它仅在应用程序中的所有模块都使用相同的CRT DLL时才起作用。如果可执行文件和所有DLL都是由同一个供应商编写的,这通常不是什么大问题,但您仍然需要注意这一点。(对于为第三方使用而分发的DLL,情况更是如此。)