used in a static library:
使用lib文件。lib是已经编译好的二进制文件,可以与你的工程静态链接起来成为一个exe。
也是就是 比如你用到这个库里的函数,这些函数代码(二进制代码)都拷贝到你的代码程序里来了,所以运行时可以直接找到这些函数,所以可以在没有这些库的机器上运行
used in a shared dll:
使用dll文件,函数实现隐藏在DLL文件内部,你的工程编译成exe文件后,运行时才调用dll
也就是说 当你用到这些库里的函数时,这些函数代码并没有被拷贝到你的程序中来,而是把这些函数是属于哪个库及它们在库中的地址等信息记录下来。。。所以当你的程序运行时,当用到这些函数时,会根据已记录下的信息把函数所属的库加载进地址空间来,再找到要运行的函数地址,这样才可以运行。。。
所以运行你的程序的机器必须要有这些函数所属的库
以下摘自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 来查看导入了哪些库。