首页 > Windows 和 Linux 应用程序从上到下调用层次比较

Windows 和 Linux 应用程序从上到下调用层次比较

        刚毕业的时候,做了将近一年的Window下的程序开发,主要用MFC,那是也不明白程序在操作系统角度从上到下的整个调用层次。遇到调用库函数,不明白,就查MSDN,每个月1500行代码左右,那时以为这就是软件开发了。后来跳槽的另外一家公司,工作也是Windows下的程序开发,这里可以用到多线程、COM组件,还能用到设计模式,那时高兴的不得了。刚开始用到多线程,就买了一本书《WIN32多线程程序设计》,边学边用。

       创建线程有好几种方法,比如: CreatThread _beginthread()等,记得当时不明白这几种方法有何区别,就随便拿一个用。心中有疑问:怎么创建一个线程这么多函数?WINAPICRTMFC 到底有何关联?最近读《程序员的自我修养》一书,给了我明确的答复。参考下图:

 

 

        从上图可以看到,CRTMFC函数最终都是调用WINAPI来实现的。即CRTMFC库函数都是对WIN API的封装。终于明白了创建线程函数分属不同的层次/类库,如下: 

        1    WINAPI: CreateThread();

        2    CRT:             _beginthread();     _beginthreadex();       

        3    MFC             AfxBeginThread();

 

 

 

         Linux下应用程序调用层次如下图: 

 

 上图只是列出了CRT,当然也存在其它很多类库,比如LinuxQT库,也是对系统调用的封装。

 

 从Windowslinux程序调用层次图,我们可以看到有如下区别:

Linux下可以直接进行程序调用,而Windows下不能直接进行系统调用。即Windows下的系统调用接口微软并没有开放给developer, 而是在系统调用上面添加了一层WINAPI。至于微软为什么不开放系统调用,而添加一层WINAPI,诸位可以参考《程序员的自我修养》第12章的12.3.2Windows API是以DLL导出函数的形式暴露给developer的,核心DLLkernel32.dlluser32.dllgdi32.dll. 我们可以用dumpbin /EXPORTS *.dll命令来查看每个dll的导出函数。

 

根据以上2个图,来简单谈一下跨平台编程。大家知道windows下的应用程序.exe放到Linux下是不能运行的,反之,Linux下同样不能运行Windows下的程序,就相当于用PDF Reader 打不开 Word文档一样,大家知道Windows下的可执行文件是PE文件格式,Linux可执行文件下是ELF文件格式。

我们程序员写的代码,用Windows下的编译器连接器(cl, VC++编译链接器)编译连接后,生成的目标文件是PE文件格式,同样的代码在Linux下用编译器gcc编译,链接器ld链接,生成的目标文件是ELF文件格式。同样的代码在不同的平台下编译通过的前提是代码中的函数符号(Symbol)能够被正确识别,这里我们不得不提及CRT,即C Runtime, Windows下是MSVCRT, Linux下是glibc (GNU C Library). C 语言运行库至少包含如下功能:

1.      程序的启动和退出;

2.       标准函数, 既是C语言标准库;

3.       I/0

4.       heap 封装和实现;

5.       调试

    我们主要关注第2点:标准函数,即只要代码中我们调用函数都是C语言标准库函数,这些函数代码在WindowsLinux下是都能识别的,因为glibcMSVCRT都在各自的平台上实现了这些函数,简单的讲就是: 提供给developer的函数接口遵从C标准库,下层实现调用各自系统的系统调用。如果你调用MFC库中的函数,这些函数Symbollinux下是无法识别的。所以我们在写跨平台C代码时(我们这里不讨论JAVA), 一定要调用标准C库函数,这样完成的代码就可以在WindowsLinux下用各自的编译器链接器编译链接(备注:包含的头文件不同,因为MSVCRTglibc导出c库函数头文件不同),生成的目标文件就可以在各自的系统上运行。 

 

 

更多相关:

  • 草色新雨中, 松声晚窗里。之前我们学习 Power Query 都是用鼠标就完成了很多复杂的操作。虽然 PowerQuery 已经将大部分常用功能内置成到功能区。基本能完成我们大部分的报表自动化功能。但是总有些复杂的或者个性化的问题是开发团队没有预先想到的,这时我们就需要学习 M 语言。一、M 语言在哪里?M语言的函数公式有三个地...

  • 前言从2020年3月份开始,计划写一系列文档--《小白从零开始学编程》,记录自己从0开始学习的一些东西。第一个系列:python,计划从安装、环境搭建、基本语法、到利用Django和Flask两个当前最热的web框架完成一个小的项目第二个系列:可能会选择Go语言,也可能会选择Vue.js。具体情况待定,拭目以待吧。。。基本概念表达式表...

  • 1.1函数1.1.1什么是函数函数就是程序实现模块化的基本单元,一般实现某一功能的集合。函数名:就相当于是程序代码集合的名称参数:就是函数运算时需要参与运算的值被称作为参数函数体:程序的某个功能,进行一系列的逻辑运算return 返回值:函数的返回值能表示函数的运行结果或运行状态。1.1.2函数的作用函数是组织好的,可重复使用的,用来...

  • 原标题:基于Python建立深度神经网络!你学会了嘛?图1 神经网络构造的例子(符号说明:上标[l]表示与第l层;上标(i)表示第i个例子;下标i表示矢量第i项)单层神经网络图2 单层神经网络示例神经元模型是先计算一个线性函数(z=Wx+b),接着再计算一个激活函数。一般来说,神经元模型的输出值是a=g(Wx+b),其中g是激活函数(...

  • 在学习MySQL的时候你会发现,它有非常多的函数,在学习的时候没有侧重。小编刚开始学习的时候也会有这个感觉。不过,经过一段时间的学习之后,小编发现尽管函数有很多,但是常用的却只有那几个。今天小编就把常用的函数汇总一下,为大家能够能好的学习MySQL中的函数。MySQL常使用的函数大概有四类。时间函数、数学函数、字符函数、控制函数。让我...

  • initializeGL函数由于是初始化,所以只调用一次 而resizeGL和paintGL会多次调用 resizeGL在正常的情况下,触发的条件是,窗口大小发生变化时,resizeGL被调用,之后会触发paint事件,从而调用paintGL()事件处理器。 paintGL在正常的情况下,只要你移动窗口的位置,就会马上触发pain...

  • 思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include   using namespace std;    class A{  public:  A(){  cout<<"A()"<

  • (1)如果用定时器的话,初始的时候注册一个定时器的回调函数,原型是 glutTimerFunc(unsigned int millis, void (*func)(int value), int value);         参数对应关系为:glutTimerFunc(毫秒数, 回调函数指针, 区别值); (2)写自己的回调函数 v...

  • 0x00 前置信息 VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析。 0x01 源码结构(Android Java相关的暂未分析) # build-android-arm-linux-androideabi/:第三方库。 # modules/:模块代码。 # modules/...

  • XnView Multi Platform是一个全平台(Windows, Linux, Mac)下的全能图片工具,类似Windows平台的美图看看,阿香婆图片浏览器等等,效果非常赞,是我在Ubuntu上的御用软件之一,对个人用户免费。...

  • 【WindowsBoot】启动必须文件 【WindowsHelp】帮助文件 【Windowsinf】安装硬件和软件时所需的inf文件 【WindowsSystem32】系统的主要组件 ActiveX文件(*.ocx)应用程序应用程序扩展(*.dll)控制面板项(*.cpl)设备驱动(*.drv)Boot所需文件驱动微软管理控制...

  • Microsoft .NET Framework 3.0, the managed programming model for Microsoft® Windows®, includes the .NET Framework 2.0, Windows Presentation Foundation, Windows Communica...

  •   Windows Vista正式发布之后相信很多喜欢尝鲜的朋友已经体验到了微软新一代操作系统的魅力,在体验的同时免不了就会和使用已久的Windows XP系统做些比较,Vista的味道究竟如何?让我们一起来看看Alex Zaharov-Reutt对Windows Vista和Windows XP在功能方面的做出的比较。    安全...

  • 首先安装rdesktop : apt-get install rdesktop.p 程序安装完后,在终端命令行中输入:$ rdesktop -g 1024x768 -d 24 ip,就进入了windows的登录窗口。这里:-g 1024*768指定了打开窗口大小;-d 24设置色彩位深为24;ip是windows虚拟机的IP地址。输入...