我用开发工具(VC6.0\.NET)写出一行一行得代码,里面包含了引用了很多的头文件(自己定义的或者c++lib里面的或者其他的),代码写好后,调试成功,生成可执行文件。我想知道,这些头文件里面的“东西”是怎么样被编译器“反映”到最后的 可执行文件里面的,编译器是怎么调用这些头文件的?win32程序最终都是依靠win32apis来实现他们的各种功能,我在程序代码里用到了c++库(lib)里面的函数(不是用来处理数据的函数诸如链表、队列函数,模板之类函数)来实现一些“实在”的功能,假如这些功能在具体在使用的时候是需要依靠api的(而我在写代码的时候是用非api函数来实现的),编译器是入如何处理这些函数代码并生成可执行文件的?这些代码在PE格式文件里面又是入如何描述的?可以列一些简单的例子吗? 写win32应用程序,就不得不考虑程序效率的问题(个人狭义的理解为完成某项功能的“快慢”问题,对否?),按照这样的理解,用apis开发(c/sdk)程序的方法和vc++/MFC开发出来的2个可以完成同样功能的程序,不考虑算法等其他因素,那个程序完成预定功能快一点?为什么?用MFC写出来的 程序是再运行的时候再托管为api函数还是再生成程序的时候已经托管好了?
讲的不错。我来说说
"
编译器是入如何处理这些函数代码并生成可执行文件的?这些代码在PE格式文件里面又是入如何描述的?"
Pe 文件里面放的函数可以分成两类,一类是动态库的函数一类是静态库的函数提。
你的代码是静态的比如mian(), WinMain,在函数里面包括的是一写代码,说白了就是汇编指令。
也包括所谓的静态link 的lib 文件,有些lib 是包括了代码的。2类是动态库的函数,在pe 中是没有他的真正的代码的,他是放在dll,中的,在你运行的时候系统调入一些dll,然后当你需要掉函数的时候就jmp xxxxxxxx
当调用一个函数的时候
asm中是;
push xxx
push xxx
call xxxxxx
他有多少个参数那么call前面旧有多少个push .(stdcall方式)
程序大多数会调用操作系统的3个核心.dll,这些都是程序在运行的时候动态连接系统文件夹内这些.dll的,而不是包装在.exe内的对吗?
小第菜的很,请各位高手指点迷津!
程序大多数会调用操作系统的3个核心.dll,这些都是程序在运行的时候动态连接系统文件夹内这些.dll的,而不是包装在.exe内的对吗? 对,是动态就不包括代码,
既然在编译的过程中会link进各种.h文件.lib文件,那么也就是说在得到的.exe文件中以某种方式“包含”了这些.h文件.lib文件,这样理解对吗?
半对,.h 文件在exe 中是没有包括的,lib 是有包括的。
.h文件是提供给cl用的。.lib 是提供给link 用的
lib会link
dll是runtime时dynamic link的