iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
Software Development

30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰系列 第 6

[Day 06] 非得用MAKE不可嗎? 讓我們再來了解一下makefile

  • 分享至 

  • xImage
  •  

先公布解答: 不是XDD

請原諒小妹前一天debug到深夜,突然一陣厭世,發文就比較不生動有趣XDD

前一天介紹了gcc gdb makefile cmake的關係(我是傳送門),接下來會介紹一下makefile的簡單使用方法。

另外補充一點,因為小妹也是最近才開始碰編譯以及C語言的新手,所以,我比較不會教怎麼做專案或是自己提供專案,因為自己也還正在學習,所以我的文章導向會比較像是利用網路上現有的資源,一步一步跟大家導讀,一起學習!

在開始了解之前可以先問問自己下面幾個問題...

  • 非得用MAKE不可嗎?
  • MAKE的定義是什麼?
  • MAKE跟MAKEFILE的關係是?
  • 除了MAKE之外其實還有幾個工具可以用?

1. MAKE的定位

上次介紹到gcc的時候有說他是一種編譯器,主要是把人類寫的語言轉換成機器看得動的語言
而MAKE是一種控編譯器的工具,意思就是用來呼叫編譯器,並指定要怎麼編譯的指令工具,例如可以選用各種類型的編譯器,不一定要用gcc之類的。

GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program's source files.

Make - GNU Project - Free Software Foundation
下面這張圖主要用來解釋 .c gcc make 還有 執行檔 之間的關聯

option.1
寫好的.c .cpp --> gcc 直接編譯 ---> 執行檔
option.2
寫好的.c .cpp --> makefile --> 用makefile來控制make --> make 在控制 gcc ---> 執行檔

2. MAKEFILE是啥?

make會根據makefile裡面的指令動作去執行,Makefile就是一個文字檔,裡面制定各種歸讓make去執行,make再根據makefile的指令控制編譯器(ex: gcc) 要怎麼編譯,大概是這樣的關係,沒有MAKEFILE gcc 也可以跑但就是會有一些隱含的官則比較不可控(例如自動把 a.c 編成 a.o),但如果要更深入的操控的話就可以用MAKEFILE

3. 非用MAKE不可嗎? 有其他可以替代也可以控制gcc的方法嗎

當然你可以直接用shell的方法控制,但麻煩,跟MAKE同為編譯控制器的還有

Ninja

文檔 build.ninja ,常由 CMake/Meson 產生 (之後會再介紹)

MSBuild(Windows/.NET/C++)

NMake

BSD make / bmake / dmake

MAKE的變體

Ant / Maven / Gradle(Java 生態)

SCons(Python)

Python 程式直接呼叫 gcc/clang

Bazel / Buck / Pants

大型多語言建置系統

xcodebuild

Apple

4. 階層關係

.c .cpp .cu .h .hpp --> CMake / Meson / GN / Autotools / Premake 
--(控制)--> Make / Ninja / MSBuild / xcodebuild...
--(控制)-->compiler ex: gcc/clang.....

上一篇
[Day 05] 什麼是 gnu、gcc、gdb、Make、CMake?
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言