profect->Setting->General中的“Use MFC in a Shared DLL”和“Use MFC in a Static Library”的区别?我编的一个ActiveX中调用含对话框的DLL,两种情况下都可以编译,但只能在“Use MFC in a Static Library”时运行。不知道为什么
Use MFC in a Shared DLL 程序运行是需要MFC类库的支持; 而Use MFC in a Static Library 可以在没有MFC类库的支持下运行,可以在任何WINDOWS系统下运行。
Use MFC in a Static Library 把MFC的库连接到你的程序里,所以这样编译得到的程序很大(相对Use MFC in a Shared DLL 而言)Use MFC in a Shared DLL 则在运行的时候还需要MFC动态库的支持,没有这些库,程序无法运行,由于不包含MFC的库,程序就小的多。
而Use MFC in a Static Library 可以在没有MFC类库的支持下运行,可以在任何WINDOWS系统下运行。
以下摘自AFX.H文件。
#ifndef _AFXDLL //MFC 静态库
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "nafxcwd.lib")
#else
#pragma comment(lib, "nafxcw.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "uafxcwd.lib")
#else
#pragma comment(lib, "uafxcw.lib")
#endif
#endif
#else //MFC 动态库
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "mfc42d.lib")
#pragma comment(lib, "mfcs42d.lib")
#else
#pragma comment(lib, "mfc42.lib")
#pragma comment(lib, "mfcs42.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "mfc42ud.lib")
#pragma comment(lib, "mfcs42ud.lib")
#else
#pragma comment(lib, "mfc42u.lib")
#pragma comment(lib, "mfcs42u.lib")
#endif
#endif
#endif//下面你可以发现msvcrt.lib和LIBC.lib没有UNICODE的区别
#ifdef _DLL //多线程动态库
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
#pragma comment(lib, "msvcrtd.lib")
#else
#pragma comment(lib, "msvcrt.lib")
#endif
#else
#ifdef _MT //多线程静态库
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
#pragma comment(lib, "libcmtd.lib")
#else
#pragma comment(lib, "libcmt.lib")
#endif
#else //单线程静态库
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
#pragma comment(lib, "libcd.lib")
#else
#pragma comment(lib, "libc.lib")
#endif
#endif
#endif//导入WINDOWS核心库和扩展库,在使用MFC时这些库是默认的库,如果选择忽略默认库则会发生LINK2001错误
//但是有些默认库可能没有用到,你可以显式的忽略它(在LINK选项里设置)
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "comdlg32.lib")
#pragma comment(lib, "winspool.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "comctl32.lib")//下面是指定生成某些专用的OBJ文件完成连接
// force inclusion of NOLIB.OBJ for /disallowlib directives
#pragma comment(linker, "/include:__afxForceEXCLUDE")// force inclusion of DLLMODUL.OBJ for _USRDLL
#ifdef _USRDLL
#pragma comment(linker, "/include:__afxForceUSRDLL")
#endif// force inclusion of STDAFX.OBJ for precompiled types
#ifdef _AFXDLL
#pragma comment(linker, "/include:__afxForceSTDAFX")
#endif#endif //!_AFX_NOFORCE_LIBS『
进入点函数的选择是由C运行库进行的。
在TCHAR.h中将_tWinMain 定义为 WinMain函数,却没有UNICODE版本的进入点函数。所以在MFC的UNICODE中要自己定义进入点函数wWinMainCRTStartup
而在没有MFC的WIN32程序中使用UNICODE则一点问题都没有而且UNICODE和_UNICODE分开定义
』可以在LINK ProjectOption中设定如下:/verbose:lib 来查看导入了哪些库。