从零开始,学习windows编程(8)--自己动手,编译CRT
2013-08-09 11:37
639 查看
翻开对应VC中的lib目录,是可以看到CRT的lib文件的,我电脑上面路径是“d:\Program Files\Microsoft Visual Studio\VC98\Lib\”,大家可以自己找一下自己的路径。经过上面的文章,我们对它已经有了一定的了解,使用它当然没问题了。那作为程序员,是不是还想看看它是怎么生成的呢?这里,就是讲如何来生成一个CRT库。
首先,你需要一张VC6的安装盘,或者VC6的安装文件。不管你是已经安装过VC,还是新装VC,安装过程我就不详细说了,主要CRT安装在下面这个画面中:
中间用红线框住的就是CRT了。
可以看一下细节,里面第3项就是CRT的源码,重点就是将这项勾选上,到时候安装目录中就有源码了,对应的源码目录也在截图中有显示,为用黄线框住的部分。
当然,为了省事,直接将VC中的组件全部安装上就可以了。
安装完之后,就可以进行编译了,不过安装盘先不要放到一边,一会我们还有用。
确保你的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
结果
XST
d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xst
编译结果
XMT
d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xmt
编译结果
XDLL
d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xdll
编译结果
http://support.microsoft.com/kb/315535/zh-cn
http://msdn.microsoft.com/en-us/library/bx6y9dab(v=vs.80).aspx
http://blog.csdn.net/yy13210520/archive/2011/03/03/6220333.aspx
安装CRT源码
既然题目是编译,那就需要源码。如果你翻开电脑中的路径,如我电脑中为“d:\Program Files\Microsoft Visual Studio\VC98\CRT\”,发现下面已经有一个SRC目录,并且里面有700多个文件和2个子目录的话,那你就是安装过CRT的源码了,可以直接跳过这段,看到下面的“编译过程”,如果碰巧没有,那想要继续,可以参考这里,来安装一下CRT的源码。首先,你需要一张VC6的安装盘,或者VC6的安装文件。不管你是已经安装过VC,还是新装VC,安装过程我就不详细说了,主要CRT安装在下面这个画面中:
中间用红线框住的就是CRT了。
可以看一下细节,里面第3项就是CRT的源码,重点就是将这项勾选上,到时候安装目录中就有源码了,对应的源码目录也在截图中有显示,为用黄线框住的部分。
当然,为了省事,直接将VC中的组件全部安装上就可以了。
安装完之后,就可以进行编译了,不过安装盘先不要放到一边,一会我们还有用。
编译过程
我们已经知道,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_.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 |
d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xst
编译结果
LIB文件 | PDB文件 |
libcd.lib | libcd.pdb |
libcid.lib | libcid.pdb |
libcpd.lib | libcpd.pdb |
d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC>nmake xmt
编译结果
LIB文件 | PDB文件 |
libcmtd.lib | libcmtd.pdb |
libcimtd.lib | libcimtd.pdb |
libcpmtd.lib | libcpmtd.pdb |
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_.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 |
参考:
http://msdn.microsoft.com/zh-cn/library/k9a8ehy3(v=vs.80).aspxhttp://support.microsoft.com/kb/315535/zh-cn
http://msdn.microsoft.com/en-us/library/bx6y9dab(v=vs.80).aspx
http://blog.csdn.net/yy13210520/archive/2011/03/03/6220333.aspx
相关文章推荐
- 从零开始,学习windows编程(8)--自己动手,编译CRT
- 从零开始,学习windows编程(8)--自己动手,编译CRT
- 从零开始,学习windows编程(7)--不使用CRT库的程序
- 从零开始学习音视频编程技术(35) windows下编译并调试ffmpeg
- 从零开始,学习windows编程(7)--不使用CRT库的程序
- 从零开始,重新学习windows编程(2)--环境准备,不用IDE编写程序
- 从零开始,学习windows编程(4)--从libc.lib开始
- 自己动手编译Windows版的OpenJDK 7
- 从零开始,学习windows编程(4)--从libc.lib开始
- 从零开始,重新学习windows编程(1)--开篇
- Windows编程原理及自己动手写计算器
- windows编程之自己动手写WinMain函数
- 从零开始,学习windows编程(3)—hello.c的疑惑
- 从零开始学习音视频编程技术(34) Linux篇之编译ffmpeg
- 从零开始,学习windows编程(5)--修改入口不为mainCRTStartup
- 从零开始,学习windows编程(6)--改换entry,link错误的简单分析
- 从零开始,学习windows编程(6)--改换entry,link错误的简单分析
- 从零开始,学习windows编程外篇(1)--分析lib文件
- 从零开始,学习windows编程(5)--修改入口不为mainCRTStartup
- 自己动手编译Windows版的OpenJDK 7