84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
是带界面的程序,(QT或者MFC),请解释一下从源码到软件的过程。我知道编译再链接,但是我做的都是控制台程序,exe只能在cmd命令行下运行,想知道直接双击运行的有界面程序是怎么做出来的,谢谢。
人生最曼妙的风景,竟是内心的淡定与从容!
謝謝邀請,這個問題實在太大了,不知道你是哪裡不明白,所以我只能嘗試解釋一些東西,其他的需要你翻閱編譯原理、圖形圖形、操作系統等方面的知識了。 [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] 你雙擊程序就啟動,這個過程是操作系統給程序發了一個加載的命令,讓程序加載到內存使用,你也可以從命令行啟動帶圖形界面的程序,這個沒啥神秘的。
有介面的程序,個人感覺是控制台程式的變種,在控制台程式的基礎上擴展了圖形介面和輸入輸出的功能,其內部實現機制也是調用了Windows自帶的繪圖函數。例如mfc,底層介面由系統實現,開發者只需要使用mfc的訊息傳遞機制實現功能設計就可以。個人理解有限,希望可以幫到你
在專案屬性裡面選擇靜態編譯, 編譯出來的exe檔就可以在其他電腦上運行的
控制台程式也可以雙擊直接運行=_=#帶GUI的程式一般是呼叫了系統的GUI介面畫圖,並且隱藏控制台運行的。 一般的GUI程式都有一個類似無限迴圈的部分用來讓行程不自動關閉。 假如你在控制台裡搞個死循環,然後雙擊,也能看到一個不自動關閉的控制台。 話說這時候應該問問專業的 @vczh
也是編譯器編譯出來的,只不過參數不同,產生的 exe 檔案 PE 頭部某個值不同,以讓系統用 win32 子系統運作之,因此沒有命令列視窗
謝謝邀請,這個問題實在太大了,不知道你是哪裡不明白,所以我只能嘗試解釋一些東西,其他的需要你翻閱編譯原理、圖形圖形、操作系統等方面的知識了。
[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] 你雙擊程序就啟動,這個過程是操作系統給程序發了一個加載的命令,讓程序加載到內存使用,你也可以從命令行啟動帶圖形界面的程序,這個沒啥神秘的。
有介面的程序,個人感覺是控制台程式的變種,在控制台程式的基礎上擴展了圖形介面和輸入輸出的功能,其內部實現機制也是調用了Windows自帶的繪圖函數。例如mfc,底層介面由系統實現,開發者只需要使用mfc的訊息傳遞機制實現功能設計就可以。個人理解有限,希望可以幫到你
在專案屬性裡面選擇靜態編譯, 編譯出來的exe檔就可以在其他電腦上運行的
控制台程式也可以雙擊直接運行=_=#
帶GUI的程式一般是呼叫了系統的GUI介面畫圖,並且隱藏控制台運行的。
一般的GUI程式都有一個類似無限迴圈的部分用來讓行程不自動關閉。
假如你在控制台裡搞個死循環,然後雙擊,也能看到一個不自動關閉的控制台。
話說這時候應該問問專業的 @vczh
也是編譯器編譯出來的,只不過參數不同,產生的 exe 檔案 PE 頭部某個值不同,以讓系統用 win32 子系統運作之,因此沒有命令列視窗