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

从零开始,学习windows编程(8)--自己动手,编译CRT
翻开对应VC中的lib目录,是可以看到CRT的lib文件的,我电脑上面路径是“d:Program FilesMicrosoft Visual StudioVC98Lib”,大家可以自己找一下自己的路径。经过上面的文章,我们对它已经有了一定的了解,使用它当然没问题了。那作为程序员,是不是还想看看它是怎么生成的呢?这里,就是讲如何来生成一个CRT库。

安装CRT源码

既然题目是编译,那就需要源码。如果你翻开电脑中的路径,如我电脑中为“d:Program FilesMicrosoft Visual StudioVC98CRT”,发现下面已经有一个SRC目录,并且里面有700多个文件和2个子目录的话,那你就是安装过CRT的源码了,可以直接跳过这段,看到下面的“编译过程”,如果碰巧没有,那想要继续,可以参考这里,来安装一下CRT的源码。

首先,你需要一张VC6的安装盘,或者VC6的安装文件。不管你是已经安装过VC,还是新装VC,安装过程我就不详细说了,主要CRT安装在下面这个画面中:

中间用红线框住的就是CRT了。

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

可以看一下细节,里面第3项就是CRT的源码,重点就是将这项勾选上,到时候安装目录中就有源码了,对应的源码目录也在截图中有显示,为用黄线框住的部分。

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

当然,为了省事,直接将VC中的组件全部安装上就可以了。

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

安装完之后,就可以进行编译了,不过安装盘先不要放到一边,一会我们还有用。

编译过程

我们已经知道,CRT库分为单线程,多线程,动态库这三种,而这三种又分别有一个debug版本,这样就一共有6个版本的CRT库可以进行编译。微软分别称它们为ST model, MT model, DLL model, XST model, XMT model以及XDLL model。我们的目的就是将这些版本都编译出来。

编译的准备工作

在编译之前,还需要做几件工作。

确保你的nmake是可以工作的。
从VC6安装文件/CD-ROM相关目录底下,找到下面3个文件,并拷贝到对应源码目录中,对应我这里目录为“d:Program FilesMicrosoft Visual StudioVC98CRTSRC”。
MAKEFILE
MAKEFILE.INC
MAKEFILE.SUB
修改MAKEFILE文件。 搜索Winver.h所在的每一行,如果有
$(V6TOOLS)includewinver.h

则删除该行,一共有6处。(都是DLL编译时出现的)
当这些工作都做完之后,你就可以开始编译了,当然,有可能会出现其他问题,比如我就在编译DLL版本的时候遇到了一点问题,但是微软提供的需要进行修改的部分就是这么多了。

下面我们将6个版本分开来编译,这样看得更清楚。进入源码目录,然后分别输入下面的命令,并查看输出

ST
d:Program FilesMicrosoft Visual StudioVC98CRTSRC>nmake st

编译结果

所有编译出来的产出都在build目录底下,编出的一堆obj文件位于st_obj目录下,这个我们就不去管了。主要是产生的lib文件:

libc.lib
libci.lib
libcp.lib
MT
d:Program FilesMicrosoft Visual StudioVC98CRTSRC>nmake mt

编译结果

libcmt.lib
libcimt.lib
libcpmt.lib
DLL
d:Program FilesMicrosoft Visual StudioVC98CRTSRC>nmake dll

编译结果,最后编译会出现一些warning,但是没有问题,按照微软的说法,在编译CRT的时候出现这些,是正常的。(信息过多,这里只取部分警告信息)

link -nologo -filealign:4096 @buildinteldll_objlinki.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_.res MSVCRT.LIB
sample_i.lib sample_i.dll sample_i.map sample_i.res MSVCIRT.LIB
sample_p.lib sample_p.dll sample_p.map sample_p.res MSVCPRT.LIB

XST
d:Program FilesMicrosoft Visual StudioVC98CRTSRC>nmake xst

编译结果

LIB文件 PDB文件
libcd.lib libcd.pdb
libcid.lib libcid.pdb
libcpd.lib libcpd.pdb

XMT
d:Program FilesMicrosoft Visual StudioVC98CRTSRC>nmake xmt

编译结果

LIB文件 PDB文件
libcmtd.lib libcmtd.pdb
libcimtd.lib libcimtd.pdb
libcpmtd.lib libcpmtd.pdb

XDLL
d:Program FilesMicrosoft Visual StudioVC98CRTSRC>nmake xdll

编译结果

LIB文件 DLL文件 MAP文件 RES文件 PDB文件 等价对应文件(LIB)
_sampld_.lib _sampld_.dll _sampld_.map _sampld_.res _sampld_.pdb MSVCRTD.LIB
sampld_i.lib sampled_i.dll sampled_i.map sampled_i.res sampld_i.pdb MSVCIRTD.LIB
sampld_p.lib sampled_p.dll sampled_p.map sampled_p.res sampld_p.pdb MSVCPRTD.LIB

分类:默认分类 时间:2013-01-19 人气:0
本文关键词:
分享到:

相关文章

  • 新液晶显示器,购机黑屏的解决办法 2014-03-04

    新购液晶显示器将原来的CRT显示器替换下来后,开机自检正常,但进入Windows桌面时发生黑屏,重新启动后问题依旧,这种故障现象很多刚购买LCD显示器的朋友都遇见过,原因是因为原来用CRT显示器的时候显示器的刷新率或分辨率很高,(特别原来是17寸显示器的),这种设置超出了LCD的支持范围。可以启动电脑后在开始启动Windows时按下键盘上的F8键(XP)或shift键(98),选择以安全模式启动计算机,进入桌面后在“显示属性”设置界面选择“高级”选项,调出显示卡的设置界面,将“适配器”下的“刷新

  • 怎么设置双显示器显示 2014-11-02

      首先,检验笔记本是否具有双屏显示(DualView)功能。 打开“显示属性”对话框的“设置”项,如果出现有两个显示器图标,表明显卡支持双屏显示(DualView);如果没有两个显示器图标出现,只看到桌面的缩小图标,表示显卡不支持双屏显示(DualView)。 其次,将笔记本电脑扩展成双屏显示的设置如下: 将外接监视器连接在笔记本的VGA端口上,打开笔记本的“显示属性”对话框,选择“设置”选项,可以看到两个监视器的图标; 点击“高级”后选择“显示”卡,将笔记本的LCD设为主显示器,外接监视器设

  • nginx负载均衡配置-windows 2012-05-27

      nginx负载均衡配置-windows   虽然说windows上的nginx在官方文档中提到"仅作为测试"之用,但对于小规模并发场景还是比apache有不小的优势。所以,本文也将其作为windows服务器上负载均衡的主要工具进行说明。   配置实例   #user nobody;   #指定nginx进程数,通常与CPU数相一致。特别是在windows平台中,这一数值一般只能设置为1.   worker_processes 1;   #error_log logs/error.log;  

  • 怎么使Windows连接使用OpenVPN需要哪些条件 2012-06-06

      OpenVPN是一款功能非常强大的VPN服务器软件,而一些网友都想知道怎么使Windows连接使用OpenVPN。所以,今天小编就为大家特别整理了一篇相关的文章。在学习本教程之前,请网友先下载OpenVPN客户端 ,再按照本教程进行学习与操作!   1、首先打开OpenVPN文件夹,另外准备好OpenVPN线路配置文件(由VPN服务商提供)。   2、开始安装OpenVPN软件,双击EXE安装程序(如果是Vista和Win7及以上Windows系统,因为默认启用了UAC用户控制功能的缘故,需

  • windows通过linux下的openvpn登入远程服务器内网 2013-04-25

    需求:在某些网络要求比较严格的环境中,我们在异地无法远程访问公司内网,给我们的工作带来了极大的不便;但是通过openvpn我们可以轻松实现,下面就来介绍下。 1.网络环境: 公司openvpn服务器(linux):wan 75.126.207.84 lan 10.61.53.84 本地服务器(windows): wan 115.238.239.132 lan 10.10.1.132 2.所需安装软件: openvpn版本:openvpn-2.2.2.tar.gz (linux,可以到http:/

  • CRT显示器常见故障疑难问答集 2013-04-29

      对于计算机用户来讲,最亲近的莫过于显示器了,可以说它是计算机系统不可或缺的组成部分。目前大家常用的还是CRT显示器,而CRT显示器也极易出现故障,那么如何才能检查和排除这些故障呢?   以下就为大家介绍了一些显示器常见故障解答,希望能对大家使用好电脑有所帮助。   问:出现黑屏故障应如何排除?   答:计算机显示器出现黑屏是用户在使用计算机中经常遇到的问题。其实,只要稍对计算机硬件中主板、CPU、内存、显示卡等几大部件有一定的了解,非元器件的损坏的简单故障完全可以自己动手排除。出现这种情况,

  • 学习windows编程(4)--从libc.lib开始 2013-05-19

    乱想乱写飞舞之空间 从零开始,学习windows编程(4)--从libc.lib开始 从上一篇文章中,大家已经了解到有C运行时库这个概念,这个不算是新东西,但是一般都隐藏在幕后,C/C++语言教学的时候不讲,windows/linux编程的时候似乎也不会专门讲到。不过它一般是我们C/C++编程中默认会使用的一个重要部分。回想想,我们随手打出的strcpy, memset, memcpy等等,不就是C运行时库所提供出来的东西吗? 既然这样,就要好好研究一下这个东西了。 前面已经说过,针对单线程/多

  • Windows 7系统加速需要掌握的五个方法 2012-01-01

    对于长时间使用XP的人来说刚刚接触Windows 7时会觉得Windows 7运行有些缓慢。其实这完全在于个人使用习惯。在这里将要为大家讲述加速一台Windows 7电脑的五大方法。这些修复和维护过程大多为电脑发烧友所普遍采用的做法,但是对于一般用户来说还是有很大帮助的。 1. 修改启动项程序 在你电脑上安装的许多软件和应用程序,都想把自己设置成每次随你的计算机一起启动。在某些情况下,在你登录进Windows之后,他们会立刻运行。其他时间他们便会在后台默默运行。无论哪种方式,这些正在运行的程序会

  • Windows下查看同局域网其它主机MAC地址 2012-01-01

      事情是这样的,今天去面试的时候笔试有一道题问到:Windows下使用什么命令来获知同局域网内其他主机的MAC地址。一开始看到感觉很熟悉,但是却答不上来。原来建站这么就,很多使用都要使用ping命令来测试网站的可连接性和速度等等。   但是这样的ping命令并不可以看到一台主机的MAC地址。其实Windows下有一个arp的命令就可以获知局域网中其他主机的MAC地址已经IP地址的。   arp -a ( 显示 ARP 表)   还有其他参数:   -a 通过询问当前协议数据,显示当前 ARP

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.062 (s). 10 q(s)