设为首页 收藏本站
查看: 1792|回复: 0

从零开始,学习windows编程(8)--自己动手,编译CRT

[复制链接]

尚未签到

发表于 2015-5-22 13:30:22 | 显示全部楼层 |阅读模式
  翻开对应VC中的lib目录,是可以看到CRT的lib文件的,我电脑上面路径是“d:\Program Files\Microsoft Visual Studio\VC98\Lib\”,大家可以自己找一下自己的路径。经过上面的文章,我们对它已经有了一定的了解,使用它当然没问题了。那作为程序员,是不是还想看看它是怎么生成的呢?这里,就是讲如何来生成一个CRT库。
安装CRT源码
  既然题目是编译,那就需要源码。如果你翻开电脑中的路径,如我电脑中为“d:\Program Files\Microsoft Visual Studio\VC98\CRT\”,发现下面已经有一个SRC目录,并且里面有700多个文件和2个子目录的话,那你就是安装过CRT的源码了,可以直接跳过这段,看到下面的“编译过程”,如果碰巧没有,那想要继续,可以参考这里,来安装一下CRT的源码。
  首先,你需要一张VC6的安装盘,或者VC6的安装文件。不管你是已经安装过VC,还是新装VC,安装过程我就不详细说了,主要CRT安装在下面这个画面中:
  中间用红线框住的就是CRT了。
DSC0000.png
  可以看一下细节,里面第3项就是CRT的源码,重点就是将这项勾选上,到时候安装目录中就有源码了,对应的源码目录也在截图中有显示,为用黄线框住的部分。
DSC0001.png
  当然,为了省事,直接将VC中的组件全部安装上就可以了。
DSC0002.png
  安装完之后,就可以进行编译了,不过安装盘先不要放到一边,一会我们还有用。
编译过程
  我们已经知道,CRT库分为单线程,多线程,动态库这三种,而这三种又分别有一个debug版本,这样就一共有6个版本的CRT库可以进行编译。微软分别称它们为ST model, MT model, DLL model, XST model, XMT model以及XDLL model。我们的目的就是将这些版本都编译出来。
编译的准备工作
  在编译之前,还需要做几件工作。

  • 确保你的nmake是可以工作的。
  • 从VC6安装文件/CD-ROM相关目录底下,找到下面3个文件,并拷贝到对应源码目录中,对应我这里目录为“d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\”。

    • MAKEFILE
    • MAKEFILE.INC
    • MAKEFILE.SUB

  • 修改MAKEFILE文件。 搜索Winver.h所在的每一行,如果有
      $(V6TOOLS)\include\winver.h \
    则删除该行,一共有6处。(都是DLL编译时出现的)
  当这些工作都做完之后,你就可以开始编译了,当然,有可能会出现其他问题,比如我就在编译DLL版本的时候遇到了一点问题,但是微软提供的需要进行修改的部分就是这么多了。
  下面我们将6个版本分开来编译,这样看得更清楚。进入源码目录,然后分别输入下面的命令,并查看输出

  • ST
      d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake st
      编译结果
      所有编译出来的产出都在build目录底下,编出的一堆obj文件位于st_obj目录下,这个我们就不去管了。主要是产生的lib文件:

    • libc.lib
    • libci.lib
    • libcp.lib

  • MT
      d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake mt
      编译结果


    • libcmt.lib
    • libcimt.lib
    • libcpmt.lib

  • DLL
      d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake dll
      编译结果,最后编译会出现一些warning,但是没有问题,按照微软的说法,在编译CRT的时候出现这些,是正常的。(信息过多,这里只取部分警告信息)
      link -nologo -filealign:4096 @build\intel\dll_obj\linki.rsp
    .\sample_i.def : warning LNK4102: export of deleting destructor "public: virtual
    void * __thiscall exception::`vector deleting destructor'(unsigned int)"; image
    may not run correctly
    .\sample_i.def : warning LNK4102: export of deleting destructor "public: virtual
    void * __thiscall filebuf::`vector deleting destructor'(unsigned int)"; image m
    ay not run correctly
    .\sample_i.def : warning LNK4102: export of deleting destructor "public: virtual
    void * __thiscall fstream::`vector deleting destructor'(unsigned int)"; image m
    ay not run correctly
      结果
    LIB文件DLL文件MAP文件RES文件等价对应文件(LIB)
    _sample_.lib_sample_.dll_sample_.map_sample_.resMSVCRT.LIB
    sample_i.libsample_i.dllsample_i.mapsample_i.resMSVCIRT.LIB
    sample_p.libsample_p.dllsample_p.mapsample_p.resMSVCPRT.LIB

  • XST
      d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xst
      编译结果
    LIB文件PDB文件
    libcd.liblibcd.pdb
    libcid.liblibcid.pdb
    libcpd.liblibcpd.pdb

  • XMT
      d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xmt
      编译结果
    LIB文件PDB文件
    libcmtd.liblibcmtd.pdb
    libcimtd.liblibcimtd.pdb
    libcpmtd.liblibcpmtd.pdb

  • XDLL
      d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xdll
      编译结果
    LIB文件DLL文件MAP文件RES文件PDB文件等价对应文件(LIB)
    _sampld_.lib_sampld_.dll_sampld_.map_sampld_.res_sampld_.pdbMSVCRTD.LIB
    sampld_i.libsampled_i.dllsampled_i.mapsampled_i.ressampld_i.pdbMSVCIRTD.LIB
    sampld_p.libsampled_p.dllsampled_p.mapsampled_p.ressampld_p.pdbMSVCPRTD.LIB

参考:

  • http://msdn.microsoft.com/zh-cn/library/k9a8ehy3(v=vs.80).aspx
  • http://support.microsoft.com/kb/315535/zh-cn
  • http://msdn.microsoft.com/en-us/library/bx6y9dab(v=vs.80).aspx
  • http://blog.iyunv.com/yy13210520/archive/2011/03/03/6220333.aspx

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69609-1-1.html 上篇帖子: Windows 8 文件选择器(FileOpenPicker,FileSavePicker,FolderPicker) 下篇帖子: Windows 8实用窍门系列:12.windows 8的文件管理---1.File创建和String Stream Buffer方式读写
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表