iT邦幫忙

1

神奇的Makefile

  • 分享至 

  • xImage
  •  

什麼是Makefile

今天我們在linux開啟terminal打上make,系統會去執行你自定義的一些指令且這些指令是可以多個的,至於要怎們自訂義指令呢?
這個時候就是要靠Makeflie了
我們可以在Makefile裡執行c/c++、python也能做出一系列的檔案操作,且今天若要執行多個程式也可以只靠make指令達成,此外每次make系統會去檢查指定的檔案是否有變更,系統只會重新編譯有做更改的檔案藉此加快編譯速度,接下來我將會以c/c++搭配Makefile作為範例介紹。

gcc/g++介紹

在介紹撰寫編譯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;
}

https://ithelp.ithome.com.tw/upload/images/20230131/20156616nw29S7Abn5.png
常用的gcc mode

  • -g 代表執行檔案之後可以用gdb debug
  • -o targetName 代表執行檔案可以自定義名字在此範例中我指定為test(若沒使用-o 預設檔名為a.out)
  • -O2 最佳化
  • -c compile
  • -S 只產生組合語言的檔案
    若今天要執行的檔案為cpp時只需將gcc改成g++即可

gdb

上述提到的gdb是簡易的debug工具使用方法如下

gdb ./targetName

打完指令後透過start開始,接者輸入n可以逐行執行這樣就能知道哪一行出現error
https://ithelp.ithome.com.tw/upload/images/20230131/20156616tsT3M4bUBY.png
https://ithelp.ithome.com.tw/upload/images/20230131/20156616u2ekDc97LK.png

Makefile撰寫架構

介紹完這些背景後,我們可以來講Makefile的撰寫格式了!

target: target file
	command
# 是註解
$@  #目標文件
$^  # 所有的依賴文件
$<  # 第一個依賴文件
$?  # 比目標還要新的依賴文件列表

我們直接用例子解釋

下面例子為一次執行foo1.c foo2.c main.c,而程式在做的事情只是a+b跟a-b而已
至於makefile想要制定以下規則

  • make 可以產生名為main的執行檔並且支援debug
  • make filename.s 可以產生該檔案的組合語言
  • make clean 可以刪除所有指令產生的檔案

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 $< 

以上介紹就到這邊若有疑問歡迎提問~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言