在軟體開發中,make 是一個工具程式,藉由由讀取一個叫做 makefile
的檔案,自動化建構軟體。 make
是linux中的命令工具,它可以用來解析 Makefile
中的指令。 Makefile
則是一份用於管理和自動化編譯流程的配置文件,它明確指定計算機如何編譯、連結程式碼,並在大型專案中通過設計的規則顯著提升效率,減少不必要的編譯時間。
make
可以解決相依性問題makefile
來掌握程式碼架構執行make
時,會執行以下內容
make
後會去當前目錄尋找makefile
或者GNUmakefile
的檔案makefile
的文件中找到第一個目標文件(target),作為最終得目標文件Makefile
的規則,規則中有.o
的檔案會自動把.c
也加入到依賴關係中define
,將變數置換到引用的位置上Makefile
中只有行註釋,用#
符號,換行則是/
target: 目標檔1 目標檔2
<tab>gcc -o 目標執行檔案 目標檔1 目標檔2
object
檔案,也可以是執行檔
,也可是一個標籤:
隔開<tab>
,不能是空白Makefile
是由很多相依性項目(dependencies)和法則(rules)所組成
myapp: main.o 2.o 3.o
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
myapp
與main.o
、2.o
、3.o
相關main.o
與main.c
、a.h
相關,依此類推=
: 進行變數賦值動作,並以$(name)
使用:=
: 會覆蓋之前變數的值?=
: 如果變數有值的話pass,沒有則進行賦值+=
: 這個就是串接了%
為萬用字元的語法,代表所有可能的字串,例如%.c
代表所以suffix為.c
的子串
CC = gcc
OBJS = a.o b.o c.o
all: test
%.o: %.c
$(CC) -c -o $@ $<
test: $(OBJS)
$(CC) -o $@ $^
$@
:表示目前的target$^
:代表目前相依性的項目的所有東西$<
:代表目前相依性的項目的第一個東西,gcc只能編譯.c
,不能編譯.h
喔$?
: TODO: 代補充CMake 是一個跨平台的建構系統(Build System),用於軟體的建置、測試和包裝。CMake 會依照你撰寫的腳本產生平台上原生建置系統的設定檔(例如:Makefile),再使用原生建置系統編譯你的專案,CMake 的設計目標是簡化跨平台開發,讓開發者能夠以統一的方式生成不同作業系統上的建構檔案(如 Makefile、Visual Studio 專案檔案等)。
建置流程
CMake由命令式腳本語言組成,以命令組成,每個命令以括號內包裹參數
命令(參數1 參數2 ...)
cmake_minimum_required(VERSION 3.10)
project(ProjectName VERSION 1.0)
project()
add_executable(MyMain main.cpp)
add_executable()
find_package(OpenGL REQUIRED)
target_link_libraries(MyMain PRIVATE OpenGL::GL)
產生一個名為 compile_commands.json
的檔案,裡面詳細記錄了每個 .cpp/.cu
檔案的實際編譯指令(包含 include path、定義、flags 等)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)