今天我們在linux開啟terminal打上make,系統會去執行你自定義的一些指令且這些指令是可以多個的,至於要怎們自訂義指令呢?
這個時候就是要靠Makeflie了
我們可以在Makefile裡執行c/c++、python也能做出一系列的檔案操作,且今天若要執行多個程式也可以只靠make指令達成,此外每次make系統會去檢查指定的檔案是否有變更,系統只會重新編譯有做更改的檔案藉此加快編譯速度,接下來我將會以c/c++搭配Makefile作為範例介紹。
在介紹撰寫編譯c/c++的Makfile之前,我們必須先了解要如何在linux底下執行c/c++
用gcc執行c code很簡單照下面格式即可,而產生的執行檔案可透過./去執行
gcc filename.c -o targetName
./targetName
下面例子是利用gcc執行test.c這個檔案,而test.c做的只是輸出hello world!而已
//test.c
#include<stdio.h>
int main(){
printf("hello world!\n");
return 0;
}
常用的gcc mode
上述提到的gdb是簡易的debug工具使用方法如下
gdb ./targetName
打完指令後透過start開始,接者輸入n可以逐行執行這樣就能知道哪一行出現error
介紹完這些背景後,我們可以來講Makefile的撰寫格式了!
target: target file
command
# 是註解
$@ #目標文件
$^ # 所有的依賴文件
$< # 第一個依賴文件
$? # 比目標還要新的依賴文件列表
下面例子為一次執行foo1.c foo2.c main.c,而程式在做的事情只是a+b跟a-b而已
至於makefile想要制定以下規則
c code
// foo1.c
int foo1(int a,int b){
return a+b;
}
// foo2.c
int foo2(int a,int b){
return a-b;
}
// main.c
#include<stdio.h>
int foo1(int a,int b);
int foo2(int a,int b);
int main(void){
int a;
int b;
printf("input a:");
scanf("%d",&a);
printf("input b:");
scanf("%d",&b);
printf("foo1 (%d)\nfoo2 (%d)\n ",foo1(a,b),foo2(a,b));
return 0;
}
Makefile 較長的版本
main:main.o foo.o
gcc main.o foo.o -o main -g
foo.o:foo.s
gcc -g -c foo.s
main.o:main.s
gcc -g -c main.s
foo.s:foo.c
gcc -g -S foo.c
main.s:main.c
gcc -g -S main.c
clean:
rm -f *.o
rm -f *.s
rm -f main
但是造上面每一個檔案就要打一個指令真的太蠢,可以透過特殊符號來達成精簡
Makefile 精簡版
main: foo1.o foo2.o main.o
gcc -o $@ -g $^
clean:
rm -f *.o
rm -f *.s
rm -f main
%.o: %.c
gcc -c -O2 $<
%.s: %.c
gcc -S -O2 $<
以上介紹就到這邊若有疑問歡迎提問~