首頁  >  問答  >  主體

c++ - 从cpp源码到可以直接双击运行的exe文件需要做什么?

是带界面的程序,(QT或者MFC),请解释一下从源码到软件的过程。我知道编译再链接,但是我做的都是控制台程序,exe只能在cmd命令行下运行,想知道直接双击运行的有界面程序是怎么做出来的,谢谢。

黄舟黄舟2765 天前745

全部回覆(5)我來回復

  • 巴扎黑

    巴扎黑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] 你雙擊程序就啟動,這個過程是操作系統給程序發了一個加載的命令,讓程序加載到內存使用,你也可以從命令行啟動帶圖形界面的程序,這個沒啥神秘的。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 13:49:22

    有介面的程序,個人感覺是控制台程式的變種,在控制台程式的基礎上擴展了圖形介面和輸入輸出的功能,其內部實現機制也是調用了Windows自帶的繪圖函數。例如mfc,底層介面由系統實現,開發者只需要使用mfc的訊息傳遞機制實現功能設計就可以。個人理解有限,希望可以幫到你

    回覆
    0
  • 阿神

    阿神2017-04-17 13:49:22

    在專案屬性裡面選擇靜態編譯, 編譯出來的exe檔就可以在其他電腦上運行的

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 13:49:22

    控制台程式也可以雙擊直接運行=_=#
    帶GUI的程式一般是呼叫了系統的GUI介面畫圖,並且隱藏控制台運行的。
    一般的GUI程式都有一個類似無限迴圈的部分用來讓行程不自動關閉。
    假如你在控制台裡搞個死循環,然後雙擊,也能看到一個不自動關閉的控制台。
    話說這時候應該問問專業的 @vczh

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:49:22

    也是編譯器編譯出來的,只不過參數不同,產生的 exe 檔案 PE 頭部某個值不同,以讓系統用 win32 子系統運作之,因此沒有命令列視窗

    回覆
    0
  • 取消回覆