Maison > Questions et réponses > le corps du texte
是带界面的程序,(QT或者MFC),请解释一下从源码到软件的过程。我知道编译再链接,但是我做的都是控制台程序,exe只能在cmd命令行下运行,想知道直接双击运行的有界面程序是怎么做出来的,谢谢。
巴扎黑2017-04-17 13:49:22
谢谢邀请,这个问题实在太大了,不知道你是哪里不明白,所以我只能尝试解释一些东西,其他的需要你翻阅编译原理、图形图形、操作系统等方面的知识了。
[1] 首先,操作系统是只能接受二进制的代码的,这个没有异议吧,操作系统在上层软件和底层硬件之间架起了一座桥梁,以我们目前用的Intel X86架构的CPU为例,他接受的指令集格式跟ARM或者其他的CPU如Power PC之间格式上就有明显的不同,这个你需要翻阅经典的Intel 8086的指令集的经典手册: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
全英文的,但里面描述了Intel 芯片是如何运行汇编语言的。
结合你的问题,操作系统做的就是 充当一个中间层(计算机领域的一个名言:计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决),那操作系统就是在底层显卡和应用程序之间的一个桥梁。当然微软的显示方式是DirectX和GDI对显卡的操作进行封装。
[2] 编译器做的就是把源码转换成这个二进制的过程,中间用的技术如你所说,是编译和链接。但是编译器也是一个分层的结构,一般分为前端和后端,前端做的就是适配不同语言的情况,同样的编译器如GCC,支持C++/C/Objective-C等,后端适配不同的体系结构,比如适配Arm/X86/PowerPC等。只不过这个编译技术可能比较复杂,编译出来的代码有直接能运行在操作系统上的如C++、C的代码,也有编译出来的代码需要运行在VM上的如Java,以C++为例,这个过程就是把cpp的源码变成1)可以识别的二进制的过程,只不过这里的二进制又不单纯的是一个汇编的文本,而是一个依赖于特定操作系统的格式,windows成为PE格式,LINUX称为ELF格式,这也说明了为啥windows的程序放linux下默认是无法启动的,格式不同。
[3] 那么结合你的问题,这个过程中,做GUI编程时,编译器没有做其他的事情,就是把你自己的代码跟已有的GUI库进行编译连接,然后形成一个可执行文件的过程,程序运行的时候,你的GUI程序会调用已有的GUI库如Qt/MFC等,由GUI库完成图形图像的渲染,所以从本质上讲Qt跟其他的东西没什么区别,无非就是一个库供外部调用。
[4] 你双击程序就启动,这个过程是操作系统给程序发了一个加载的命令,让程序加载到内存使用,你也可以从命令行启动带图形界面的程序,这个没啥神秘的。
怪我咯2017-04-17 13:49:22
有界面的程序,个人感觉是控制台程序的变种,在控制台程序的基础上扩展了图形界面和输入输出的功能,其内部实现机制也是调用了Windows自带的绘图函数。例如mfc,底层界面由系统实现,开发者只需要使用mfc的消息传递机制实现功能设计就可以。个人理解有限,希望可以帮到你
PHP中文网2017-04-17 13:49:22
控制台程序也可以双击直接运行=_=#
带GUI的程序一般是调用了系统的GUI接口画图,并且隐藏控制台运行的。
一般的GUI程序都有一个类似无限循环的部分用来使进程不自动关闭。
假如你在控制台里搞个死循环,然后双击,也能看到一个不自动关闭的控制台。
话说这时候应该问问专业的 @vczh
伊谢尔伦2017-04-17 13:49:22
也是编译器编译出来的,只不过参数不同,生成的 exe 文件 PE 头部某个值不同,以让系统用 win32 子系统运行之,从而没有命令行窗口