iT邦幫忙

3

從0開始寫exe!

  • 分享至 

  • xImage
  •  

太棒了!這篇文章將專注於教學性質:從寫一個簡單 C 程式開始,到如何產生一個 .exe 可執行檔,並清楚說明每一個檔案是做什麼的,還會解釋 .exe 的結構、用到的檔案與工具,以及每個步驟的背後邏輯。以下就是完整教學文章內容,風格學術清楚、但不艱澀。

📘 用 C 製作 .exe 檔案的完整結構與流程教學

本文將帶你從一個簡單的 main.c 程式出發,學會製作一個 .exe 可執行檔,並介紹整個編譯鏈與檔案結構。無論你是初學者還是想了解編譯細節,這篇都適合你!

📁 一、整體流程與會出現的檔案

檔案名稱 角色 產生時機
main.c 原始 C 程式碼 開發者自己撰寫
main.o 編譯後的目標檔(物件檔) 編譯器產生
main.exe 最終可執行檔 連結器產生
stdio.h, etc. 標準函式標頭 編譯時會 include
libc.a, msvcrt.dll 標準函式庫 連結時載入使用

✍️ 二、撰寫原始 C 程式 main.c

#include <stdio.h>

int main() {
printf("Hello, world!\n");
return 0;
}

這是 C 語言中最簡單的範例。只要一行 printf(),它就會在執行時將文字輸出到終端機。

🧱 三、編譯過程總覽(從程式碼變成 .exe)

🔁 步驟分解如下:
1. 預處理(Preprocessing)
• 將 #include 和 #define 展開
• 產生中間程式碼 .i
2. 編譯(Compiling)
• 將程式碼翻譯成組合語言(.s)
• 再轉為機器碼(.o)
3. 連結(Linking)
• 把 .o 與標準函式庫連接起來
• 產生 .exe 可執行檔

🧪 四、產生 .exe 的每個檔案說明

📄 1. main.c(你的原始碼)
• 包含程式邏輯
• 使用 #include 引用標準函式庫

📄 2. main.o(目標檔 / 物件檔)
• 由編譯器產生(例如:gcc -c main.c -o main.o)
• 包含機器碼(但尚未能單獨執行)
• 通常是一部分功能,像拼圖的碎片

📄 3. main.exe(可執行檔)
• 由連結器產生(例如:gcc main.o -o main.exe)
• 包含:
• 程式機器碼
• 執行點(entry point)
• 所需函式庫位置(DLL、靜態連結)

📄 4. 標準函式庫(libc.a 或 msvcrt.dll)
• 負責像 printf()、scanf() 這些功能的實作
• 可用 靜態連結(打包進 .exe)或 動態連結(執行時載入 DLL)

🛠️ 五、使用 GCC 編譯範例(Windows)

編譯 main.c 為物件檔

gcc -c main.c -o main.o

將 main.o 連結為可執行檔(預設連結 libc)

gcc main.o -o main.exe

你也可以簡寫為:

gcc main.c -o main.exe

🗃️ 六、.exe 檔案內部長什麼樣?

.exe 檔案是依照 PE(Portable Executable)格式 結構排的:

[ DOS Header ] ← 為了兼容舊系統
[ PE Header ] ← 程式入口點、段資訊
[ .text 區段 ] ← 程式碼
[ .data 區段 ] ← 全域變數
[ .rdata 區段 ] ← 字串常數
[ .idata 區段 ] ← 引用的 DLL
[ 匯入表 / 匯出表 ] ← 外部函式連結資訊

這些內容會由 gcc + ld(GNU linker)自動產生,不用自己手動編寫。

🎯 七、常見問題與解答

Q1:我用 Linux 能產生 .exe 嗎?

可以!你需要安裝 mingw-w64 套件(交叉編譯器):

sudo apt install gcc-mingw-w64
x86_64-w64-mingw32-gcc main.c -o main.exe

這樣就能直接產生能在 Windows 執行的 .exe。

Q2:main.o 必須存在嗎?

不是必須的,如果你直接用:

gcc main.c -o main.exe

會內部完成所有步驟,但在大型專案中,我們會先產生 .o 分別編譯各模組,最後連結。

Q3:main.exe 可以跨電腦執行嗎?

可以,但若你用了 動態連結的 DLL,別人電腦上沒那個 DLL 就會執行失敗。
可使用 靜態連結(例如加上 -static)保證獨立運行。

gcc main.c -static -o main.exe

📚 八、進階主題(推薦你未來學)
• 靜態 vs 動態連結差異
• 用 Makefile 自動化建構流程
• 用 strip 移除符號表減少 .exe 檔案大小
• 用 objdump 反組譯 .exe 看看機器碼

✅ 總結

你學會了什麼?
✅ C 程式碼如何產生 .exe
✅ 編譯器產生的中間檔是什麼
✅ .exe 檔案的內部結構是什麼
✅ 怎麼在 Windows 與 Linux 製作
✅ 常見錯誤與排除方式

這篇文章就是你做出 .exe 的起點,當你未來寫出像作業系統、遊戲、AI 工具的程式時,這些 .exe 都會從這裡開始!

若你需要這篇轉為 Markdown、PDF 或要加入圖片、流程圖,我也能幫你排版整理!你要嗎?📘


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言