




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从零开始,重新学习windows编程(1)-开篇2011-06-07 12:41 by cnyao, 593 visits, 收藏, 编辑 考虑了很久,终于准备开始写这个文章,有可能会汇成一个系列,具体还是要看时间的安排,今年的事情很多,也比较的紧,不过通过具体的项目认识到自己的一些不足,在“补课”的过程中萌发了将研究的一些东西写出来的想法,希望大家批评指正。这篇文章属于基础类文章,也是对我知识的一个重新整理,以前都是写出程序来就完了,了解的东西也就是大概,凡事均为遇到问题解决问题,google、其他人的代码、MSDN、CSDN、cnblogs轮着来,总是能够把问题解决掉的,不过长期下来,得到的都是知识片段,并不能形成一个系统的认识。于是决定,从我比较熟悉的VC,从零开始,把Windows的编程知识整理一下,至少能把一些知识的片段慢慢的连贯起来。当然,VC仅仅是一个引子,之后有时间会慢慢整理关于其他语言,或者框架,“不积小流无以成沧海”,还是要从一点一滴的知识点出发,最终才能有所认识和超越。目的说完,下面就是工具和过程。工具,我主要使用VC6,如果需要使用到其他工具再慢慢进行添加,比如需要另外的Platform SDK,或者更新的Visual Studio系列如VS2003, VS2005, VS2008, VS2010又或者sysinternal的一些工具。不过现在,我们就来挖掘VC6。既然是基础,我们就不涉及到任何框架,无论是MFC,ATL,QT等,这里都不去研究,先把windows原生的SDK研究好,然后再去了解这些框架。其他,要研究Win32 SDK,那最重要的参考手册还是需要的,所以我们必须安装一个MSDN,当然,网络版的MSDN也可以,不过更喜欢本地的,如果你使用的机器上面除了VC6之外还安装了VS系列的其他版本,只需要一个MSDN就可以了,毕竟MSDN占用的空间也不小。研究过程,首先了解windows的编程框架,VC6这个IDE编译链接的过程原理,一个简单的Win32程序的解析,其中使用到的API的详解,最后,会找一个简单的开源程序,来具体查看其是怎么使用Win32SDK编写的。其中还会穿插介绍一些相关的网站、书籍等。基础(pre-condition),对C语言的语法有了解,这里的了解并不是会写hello world,而是对于宏的应用,指针包括函数指针,typedef等有自己的认识,因为win32SDK中大量的使用了这些知识,而这些在文中只会一点而过。同时对编译、链接的过程有一定的了解,对于make也应该知道。其他,我们一起慢慢来学习吧!大家有什么意见和建议,也可以提给我,我在研究的过程中,也会就这些知识点加深理解,这是一个艰苦的过程,不过也应该是充满收获的过程!从零开始,重新学习windows编程(2)-环境准备,不用IDE编写程序2011-06-08 14:00 by cnyao, 799 visits, 收藏, 编辑 既然是求甚解,那就要脱离掉IDE,保证每个字符都是经过思考产生出来的,其实我们脱离掉IDE环境,更能够了解到每一步的执行是怎么样的,IDE到底在你选择项目、创建项目的时候为了做了哪些事情,还有一个好处就是,当你想写一个小的测试程序的时候,你就不用打开VC,而直接用文本编辑器编写好,直接在命令行中编译运行就可以看到结果了,节约了不少时间。下面,我们就来看看怎么做才可以脱离IDE工作。1. 在VC6安装好的前提下,win+R,输入cmd,在出现的命令行窗口中试下nmake命令,如果能执行该命令,那就可以进行下面的操作,否则需要按照步骤2中的操作设置环境变量。如果学习过java的同学,或者使用过linux的同学,应该对这个很熟悉。2. 在cmd环境下,可以使用echo %path%命令,来显示一下现在系统中的环境变量路径。或者,右键点击“我的电脑”,在出现的“属性”对话框中,选择“Advanced”Tab页,在 “Environment Variables”中,“用户环境变量”里面找到“path”,点击修改。3. 找到你电脑中nmake.exe所在的地方,我电脑中为“d:Program FilesMicrosoft Visual StudioVC98BinNMAKE.EXE”,就将“d:Program FilesMicrosoft Visual StudioVC98Bin这个路径加入到path中,因为有可能大家电脑的环境变量中还有Platform SDK和其他版本VS的路径,所以希望使用哪个,就将哪个放到最前面。在这个目录下,你还可以看到有其他的exe程序,有些我们之后也会使用到,比如CL.EXE和LINK.EXE,还有一个VCVARS32.BAT之后我们也会稍微介绍一下,当添加了这个路径到环境变量之后,所有该路径下的exe就都可以使用了。4. 设置完成后,重新开启一个cmd,使用echo %path%命令查看刚刚的路径是否添加上去了,是否是在最前。再进行步骤1的操作,看看是否可以执行nmake命令。最终得到的结果为:1 D:nmake2 3 Microsoft (R) Program Maintenance Utility Version 6.00.8168.04 Copyright (C) Microsoft Corp 1988-1998. All rights reserved.5 6 NMAKE : fatal error U1064: MAKEFILE not found and no target specified7 Stop.复制代码5. 当设置完NMAKE.EXE成功后,你可以试着执行一下CL.EXE命令,如果报出一个找不到mspdb60.dll,不用慌张,那是因为还有一个路径没有设置。在电脑中寻找mspdb60.dll文件,我的电脑中路径为“d:Program FilesMicrosoft Visual StudioCommonMSDev98BinMSPDB60.DLL”,从路径名称可以看到,这应该是属于Dev环境的一个公共文件,这里我们不管它具体的,直接将路径“d:Program FilesMicrosoft Visual StudioCommonMSDev98Bin加入path中,刚刚加入的路径之后,两个路径之间记得用英文字符的分号(;)分隔开来。6. 同样,设置path,重启cmd窗口,echo查看下设置是否成功,然后执行cl,link命令。结果如下:1 D:cl2 Microsoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x863 Copyright (C) Microsoft Corp 1984-1998. All rights reserved.4 5 usage: cl option. filename. /link linkoption. 复制代码link 1 D:link 2 Microsoft (R) Incremental Linker Version 6.00.8168 3 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. 4 5 usage: LINK options files commandfile 6 7 options: 8 9 /ALIGN:#10 /BASE:address|filename,key11 /COMMENT:comment12 /DEBUG13 /DEBUGTYPE:CV|COFF14 /DEF:filename15 /DEFAULTLIB:library16 /DELAY:NOBIND|UNLOAD17 /DELAYLOAD:dll18 /DLL19 /DRIVER:UPONLY|WDM20 /ENTRY:symbol21 /EXETYPE:DYNAMIC22 /EXPORT:symbol23 /FIXED:NO24 /FORCE:MULTIPLE|UNRESOLVED25 /GPSIZE:#26 /HEAP:reserve,commit27 /IMPLIB:filename28 /INCLUDE:symbol29 /INCREMENTAL:YES|NO30 /LARGEADDRESSAWARE:NO31 /LIBPATH:dir32 /LINK50COMPAT33 /MACHINE:ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH434 /MAP:filename35 /MAPINFO:EXPORTS|FIXUPS|LINES36 /MERGE:from=to37 /NODEFAULTLIB:library38 /NOENTRY39 /NOLOGO40 /OPT:ICF,iterations|NOICF|NOREF|NOWIN98|REF|WIN9841 /ORDER:filename42 /OUT:filename43 /PDB:filename|NONE44 /PDBTYPE:CONSOLIDATE|SEPTYPES45 /PROFILE46 /RELEASE47 /SECTION:name,ERWSDKLPX48 /STACK:reserve,commit49 /STUB:filename50 /SUBSYSTEM:NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX,#.#51 /SWAPRUN:CD|NET52 /VERBOSE:LIB53 /VERSION:#.#54 /VXD55 /WARN:warninglevel56 /WINDOWSCE:CONVERT|EMULATION57 /WS:AGGRESSIVE到这里,我们的环境设置算是完成了一半,下面还有一半是设置库和头文件,首先来看看库和头文件不设置会出现什么情况。这里做个小例子,照旧例,还是hello world.随便进入某个目录,创建一个hello.c内容很简单,printf一串字符吧。用你最喜爱的文本编辑器写下下面的代码:1 #include 2 3 int main()4 5 printf(abcdefg.n);6 return 0;7 复制代码然后进入命令行,在命令行中进入代码所在的目录,我这里是d:test全部执行过程如下:1 d:testcl hello.c2 Microsoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x863 Copyright (C) Microsoft Corp 1984-1998. All rights reserved.4 5 hello.c6 hello.c(1) : fatal error C1083: Cannot open include file: stdio.h: No such fil7 e or directory复制代码可以发现没有找到stdio.h,这里在环境变量中还要设置一个头文件的目录。同样在“用户变量”中查找,找名字为include的环境变量是否存在,不存在则新建一个,然后找到你电脑中stdio.h所在的路径,我的为“d:Program FilesMicrosoft Visual StudioVC98Include”,将其放到include环境变量对应的value中。再进行编译 1 d:testcl hello.c 2 Microsoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x86 3 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. 4 5 hello.c 6 Microsoft (R) Incremental Linker Version 6.00.8168 7 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. 8 9 /out:hello.exe10 hello.obj11 LINK : fatal error LNK1104: cannot open file LIBC.lib复制代码结果出现找不到LIBC.lib错误,关于LIBC.lib,在之后的篇章里面会详细介绍到。我们还是要将其放到环境变量中,同include环境变量,我们同样加上lib这个环境变量在“用户变量”中,对应的值为你找到的LIBC.lib所在的目录,我这里为“D:Program FilesMicrosoft Visual StudioVC98lib”,然后再试一把。 1 D:cd test 2 3 D:testcl hello.c 4 Microsoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x86 5 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. 6 7 hello.c 8 Microsoft (R) Incremental Linker Version 6.00.8168 9 Copyright (C) Microsoft Corp 1992-1998. All rights reserved.10 11 /out:hello.exe12 hello.obj13 14 D:testhello.exe15 abcdefg.复制代码大功告成,可以看到cl hello.c就编译出来了hello.exe,执行hello.exe得到输出。 So easy是不是?这样你就掌握到如何在命令行中编译win32 console Application了,至于其他类型的Application,就需要不同的编译、链接设置以及不同的头文件、库设置而得到,但是基本原理是差不多的。But这里提几个问题,看看你能不能回答出来。1. 这里是hello.c,如果是hello.cpp,cl的行为有没有不同?2. 如果是两个或多个文件,那使用cl是否可以直接编译出来exe文件?3. 将入口修改为void main()是否可以,或者void start()呢?4. stdio.h大家都知道是C的标准库内容,windows是如何将它合入到系统中去的呢?5. 同样,stdio.h只是头文件,而具体函数实现是在lib库中,windows又是如何将其合到exe文件中的呢?6. 刚刚我们打印的是英文字符,那如果我们要打入中文你好,世界,结果会怎样,到底是为什么呢?这其实也是我的疑惑,也是下一篇文章要讨论的内容,暂定题为hello.c的疑问,我努力解答。从零开始,学习windows编程(3)hello.c的疑惑2011-06-10 14:32 by cnyao, 2022 visits, 收藏, 编辑 上一篇,我们问了几个问题,这一篇就从hello.c的各个方面来研究研究,等到这一篇的结束来看这些疑惑有哪些是可以解答了的,当然还有一些可能要放到后面解决了。既然要抽丝剥茧,就要从手头已有的线索出发,同时加上搜索到的知识,以及自己的思考,任何问题的解决都是通过这个路径(当然,老板除外,老板这种生物只需要发出指令,然后得到结果就OK了)。我们现在有的,是一个hello.c文件,通过cl命令就可以生成目标hello.exe文件。那我们就可以研究一下cl这个东西。CL解释CL.EXE(或cl.exe,似乎windows的文件系统对于大小写是不敏感的),是何许人也呢?直接引用微软的说辞吧(/en-us/library/9s7c9wdw(v=vs.71).aspx)。CL.exe is a 32-bit tool that controls the Microsoft C and C+ compilers and linker. The compilers produce Common Object File Format (COFF) object (.obj) files. The linker produces executable (.exe) files or dynamic-link libraries (DLLs).Note that all compiler options are case sensitive.To compile without linking, use /c.因为VC6的版本说明没有找到,这里的说明文字是Visual studio 2003的CL.EXE说明,不过都是一样的。从上面的说明可以看到CL是用来控制微软C和C+编译器(compiler)和链接器(linker),一共做了两件事情。编译器会生成COFF文件格式的目标文件(.obj);链接器会生成可执行文件(.exe)或者动态链接库文件(DLLs)。对比我们之前的做法,的确是执行cl命令之后,生成了一个hello.obj文件和一个hello.exe文件。另外在最后,还说明了一下,使用/c选项,则可以不进行链接过程。CL选项那cl还有哪些选项呢?使用cl /?来看看。 1 d:testcl /? 2 Microsoft (R) 32-bit C/C+ Optimizing Compiler Version 12.00.8168 for 80x86 3 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. 4 5 C/C+ COMPILER OPTIONS 6 7 -OPTIMIZATION- 8 9 /O1 minimize space /Op- improve floating-pt consistency10 /O2 maximize speed /Os favor code space11 /Oa assume no aliasing /Ot favor code speed12 /Ob inline expansion (default n=0) /Ow assume cross-function aliasing13 /Od disable optimizations (default) /Ox maximum opts. (/Ogityb1 /Gs)14 /Og enable global optimization /Oy- enable frame pointer omission15 /Oi enable intrinsic functions16 17 -CODE GENERATION-18 19 /G3 optimize for 80386 /Gy separate functions for linker20 /G4 optimize for 80486 /Ge force stack checking for all funcs21 /G5 optimize for Pentium /Gsnum disable stack checking calls22 /G6 optimize for Pentium Pro /Gh enable hook function call23 /GB optimize for blended model (default) /GR- enable C+ RTTI24 /Gd _cdecl calling convention /GX- enable C+ EH (same as /EHsc)25 /Gr _fastcall calling convention /Gi- enable incremental compilation26 /Gz _stdcall calling convention /Gm- enable minimal rebuild27 /GA optimize for Windows Application /EHs enable synchronous C+ EH28 /GD optimize for Windows DLL /EHa enable asynchronous C+ EH29 30 /Gf enable string pooling /EHc extern C defaults to nothrow31 /GF enable read-only string pooling /QIfdiv- enable Pentium FDIV fix32 /GZ enable runtime debug checks /QI0f- enable Pentium 0x0f fix33 34 -OUTPUT FILES-35 36 /Fafile name assembly listing file /Fo name object file37 /FAsc configure assembly listing /Fp name precompiled header file38 /Fdfile name .PDB file /Frfile name source browser file39 /Fe name executable file /FRfile name extended .SBR file40 /Fmfile name map file41 42 -PREPROCESSOR-43 44 /C dont strip comments /FI name forced include file45 /D=|# define macro /U remove predefined macro46 /E preprocess to stdout /u remove all predefined macros47 /EP preprocess to stdout, no #line /I add to include search path48 /P preprocess to file /X ignore standard places49 50 -LANGUAGE-51 52 /Zi enable debugging information /Zl omit default library name in .OBJ53 /ZI enable Edit and Continue debug info /Zg generate function prototypes54 55 /Z7 enable old-style debug info /Zs syntax check only56 /Zd line number debugging info only /vd0|1 disable/enable vtordisp57 /Zpn pack structs on n-byte boundary /vm type of pointers to members58 /Za disable extensions (implies /Op) /noBool disable bool keyword59 /Ze enable extensions (default)60 61 -MISCELLANEOUS-62 63 /?, /help print this help message /V set version string64 /c compile only, no link /w disable all warnings65 /H max external name length /W set warning level (default n=1)66 /J default char type is unsigned /WX treat warnings as errors67 /nologo suppress copyright message /Ycfile create .PCH file68 /Tc compile file as .c /Yd put debug info in every .OBJ69 /Tp compile file as .cpp /Yufile use .PCH file70 /TC compile all files as .c /YXfile automatic .PCH71 /TP compile all files as .cpp /Zm max memory alloc (% of default)72 73 -LINKING-74 75 /MD link with MSVCRT.LIB /MDd link with MSVCRTD.LIB debug lib76 /ML link with LIBC.LIB /MLd link with LIBCD.LIB debug lib77 /MT link with LIBCMT.LIB /MTd link with LIBCMTD.LIB debug lib78 /LD Create .DLL /F set stack size79 80 /LDd Create .DLL debug libary /link linker options and libraries复制代码具体可以看(/en-us/library/19z1t1wy(v=VS.71).aspx)来了解。选项的具体使用原来有这么多的选项。数了一下,有99个选项之多。每个选项都有自己的作用,就需要使用的时候去熟悉了,不过我们现在不需要了解这么多,我们就来看下/c选项好了。This option prevents the automatic call to LINK. Compiling with /c creates .obj files only. You must call LINK explicitly with the proper files and options to perform the linking phase of the build.Any internal project created in the development environment uses the /c option by default.To set this compiler option in the Visual Studio development environmentThis option is not available from within the development environment.To set this compiler option programmaticallyThis compiler option cannot be changed programmatically.要彻底理解它,就必须知道C语言到目标代码的过程。首先,C语言中有两种文件,一个.c文件(我们一般称之为源文件),一个.h文件(我们一般称之为头文件)。头文件一般会被源文件包含,而源文件会被编译成一个二进制中间文件,之后所有的二进制中间文件会通过链接器进行链接,形成一个可以在某个特定系统上执行的二进制可执行文件。于是,C语言-可执行代码可以明显的分为编译过程和链接过程,而由于C语言中一种特殊语法-“宏”的存在,所以还有一个预编译过程,在预编译过程中,C语言中的宏会被展开;同时,包含的头文件中的代码,会根据条件编译等,囊括到源文件中,这些工作做好后,给编译器的就是一份新的源码文件,供编译阶段使用。另外,相信大家都知道,C语言是从汇编语言发展过来的,汇编是从机器码发展过来的,以前的编译器都是先将C语言编译成汇编语言,再将其解释成机器码就可以了。现代编译器除了做这个,还可以对代码进行优化。不过基本思想是一直没有变的。而我们做C开发的时候,有时稍微看一下汇编之后的代码,对于计算机是如何执行程序的过程,会有更清晰的认识。那么,用cl可以生成汇编代码吗?答案当然是肯定的。在命令行输入cl /FA hello.c,看看生成了哪些东西?当然,如果你不要生成.exe文件,可以加上/c选项。可以看到生成了.obj文件和.asm文件。查看asm文件内容 1 TITLE hello.c 2 .386P 3 include listing.inc 4 if Version gt 510 5 .model FLAT 6 else 7 _TEXT SEGMENT PARA USE32 PUBLIC CODE 8 _TEXT ENDS 9 _DATA SEGMENT DWORD USE32 PUBLIC DATA10 _DATA ENDS11 CONST SEGMENT DWORD USE32 PUBLIC CONST12 CONST ENDS13 _BSS SEGMENT DWORD USE32 PUBLIC BSS14 _BSS ENDS15 _TLS SEGMENT DWORD USE32 PUBLIC TLS16 _TLS ENDS17 FLAT GROUP _DATA, CONST, _BSS18 ASSUME CS: FLAT, DS: FLAT, SS: FLAT19 endif20 PUBLIC _main21 EXTRN _printf:NEAR22 _DATA SEGMENT23 $SG336 DB abcdefg., 0aH, 00H24 _DATA ENDS25 _TEXT SEGMENT26 _main PROC NEAR27 ; File hello.c28 ; Line 429 push ebp30 mov ebp, esp31 ; Line 532 push OFFSET FLAT:$SG33633 call _printf34 add esp, 435 ; Line 736 xor eax, eax37 ; Line 838 pop ebp39 ret 040 _main ENDP41 _TEXT ENDS42 END复制代码这个汇编代码,仅仅用cl再进行编译,我还没有找到方法,所以这里就要引入一个新工具-ml,ml是MASM中编译汇编代码使用的编译器,同样,它也会调用到link,并且让它不调用link,使用的编译选项也是/c。 从cl和hello.c,我们引出了hello.obj,hello.asm,以及ml.exe,包括C语言到可执行文件的过程。下面先跳过ml,来看看链接过程。链接过程链接过程也就是将.obj变成.exe的过程,使用的是link.exe。直接使用cl /c hello.c产生的hello.obj文件,输入命令link hello.obj,直接就生成了.exe文件。真简单不过,且慢,我们有main函数,但是至少printf函数这个东西,是在哪里呢?秘密就藏在生成的那个.obj文件中啦!如果用另外一个.obj文件(稍候我们会用另外一个hello.obj),那就会得到错误哦。那我们打开obj文件来看看吧。怎么?还要看二进制文件?不用担心,看的还是英文字符,多说无用,还是看下就知道了。这里我使用的是winhex,其实使用其他任何一个文本编辑器都是可以的,不过看二进制文件我还是习惯使用专门的二进制编辑器。截图用的picpick。顺便说明下。左边是文件内容,主要看右边,红线划过的地方。看不清的同学可以看这里:-defaultlib:LIBC defaultlib:OLDNAMES其实,链接过程会将所有的静态库和目标文件进行链接,而在这份hello.obj文件中,指定了两个default lib,一个为libc.lib,一个为oldnames.lib。而这两个lib文件又是何方神圣呢?libc.lib为单线程静态C标准库(在cl中可使用/ML选项定义对其的链接),而oldnames.lib则是为了兼容微软以前的C/C+开发系统,基本不使用了,至少在我们这个hello.c编译链接成exe的过程中,可以忽略掉它。其实,我们用一个很简单的方法可以知道我们的程序链接了哪些库。 1 d:testlink /verbose:lib hello.obj 2 Microsoft (R) Incremental Linker Version 6.00.8168 3 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. 4 5 Searching Libraries 6 Searching D:Program FilesMicrosoft Visual StudioVC98libLIBC.lib: 7 Searching D:Program FilesMicrosoft Visual StudioVC98libOLDNAMES.lib: 8 Searching D:Program FilesMicrosoft Platform SDKLib.kernel32.lib: 9 10 Done Searching Libraries复制代码这里还可以使用一个小工具,叫做dumpbin的,可以利用它的选项来分析hello.obj文件,看到defaultlib,而不用打开文件自己查看。 1 d:testdumpbin /DIRECTIVES hello.obj 2 Microsoft (R) COFF Binary File Dumper Version 6.00.8168 3 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. 4 5 Dump of file hello.obj 6 7 File Type: COFF OBJECT 8 9 Linker Directives10 -11 -defaultlib:LIBC12 -defaultlib:OLDNAMES13 14 Summary15 16 A .data17 26 .drectve18 14 .text复制代码oldnames.lib我们可以略过,但是libc.lib我们还是需要了解的,今后要做VC相关项目,使用到第三方库的会经常用到。为了解释libc.lib,我们需要引入一个新的概念-“C语言运行库”,这里我们只讨论windows平台,VC中使用的被称为MSVC CRT。 另外还要牵涉到的一个概念就是线程。C语言运行时库(C Run-time Library)-CRT要了解这个东西,就需要对C语言的发展史有一定的了解。C语言是在上世纪70年代在B语言的基础上被发明出来的,之后Dennis Ritchie 和 Brian Kernighan 就用C本身重写了90%以上的 UNIX 系统函数。并且把其中最常用的部分独立出来,形成头文件和对应的 LIBRARY,C run-time library 就是这样形成的。在类UNIX系统中,C运行库被认为是系统的一部分。我们看看维基百科上面的定义吧In computer programming, a runtime library is a special program library used by a compiler, to implement functions built into a programming language, during the execution (runtime) of a computer program. This often includes functions for input and output, or for memory management.而随着C语言的流行,出现了很多C编译器,也就有很多C运行时库的实现。主要有下面的几种 BSD libc, implementations distributed under BSD operating systems. GNU C Library, used in GNU/Linux and GNU/HURD. Dinkum C99 Library from Dinkumware, most common commercially licensed one Microsoft C Run-time Library, part of Microsoft Visual C+ dietlibc, an alternative small implementation of the C standard library (MMU-less) uClibc, a C standard library for embedded Linux systems (MMU-less) Newlib, a C standard library for embedded systems (MMU-less) klibc, primarily for booting Linux systems. EGLIBC, variant of glibc for embedded systems. musl, another lightweight C standard library implementation for Linux systems可以看到,我们现在讨论的Microsoft C Run-time Library也是其中的一种。在那个年代,线程还没有被应用到操作系统上,应用程序都是单线程的。所以最初的C Run-time Library都是单线程的。另外动态库的概念也是后期出现的,所以一开始C Run-time Library也只是静
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省沧州市盐山中学2025-2026学年九年级上学期第一次月考物理试题(含解析)
- 湖北省谷城县2026届九上化学期中经典试题含解析
- 浙江省仙居县2026届九上化学期中学业水平测试模拟试题含解析
- 2026届河南省周口沈丘县联考英语九年级第一学期期末调研试题含解析
- 2026届安徽省滁州地区化学九上期末检测试题含解析
- 2026届广东省湛江市名校九年级英语第一学期期末质量跟踪监视试题含解析
- 离婚后子女抚养权争议调解及教育支持服务合同
- 夫妻离婚前财产分割与债权债务协议范本
- 专科英语考试题及答案
- 生态修复工程树木种植与生态监测承包合同
- GB/T 21063.4-2007政务信息资源目录体系第4部分:政务信息资源分类
- 机修车间岗位廉洁风险点及防范措施表
- 全新版尹定邦设计学概论1课件
- 牙及牙槽外科
- 文物建筑保护修缮专项方案
- 万用表 钳形表 摇表的使用课件
- 63T折弯机使用说明书
- 170位真实有效投资人邮箱
- 工程力学ppt课件(完整版)
- 《区域经济学》讲义(1)课件
- 船模制作教程(课堂PPT)课件(PPT 85页)
评论
0/150
提交评论