static library 与shared dll 区别

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   来查看导入了哪些库。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值