例項講解Linux下的makefile

2021-09-22 06:40:49 字數 2663 閱讀 3709

1、程式**結構如下

makefile/

|--makefile

|--haha.c

`-- hehe.c

1.1、需要被編譯的源**如下

$ cat haha.c 

#include

"stdio.h

"int

main()

$ cat hehe.c 

#include

"stdio.h

"int

main()

1.2、makefile的指令碼如下

$ cat makefile 

.phony : dummy

cflags =ldflags =all_files =hehe haha

all : $(all_files)

hehe : hehe.o

gcc -o hehe hehe.o

hehe.o : hehe.c

gcc -c hehe.c -o $@

haha : haha.o

gcc -o haha haha.o

haha.o : haha.c

gcc -c haha.c -o haha.o

clean : dummy

rm -rf *.o

rm -rf $(all_files)

1.3、執行make命令後的編譯結果

$ make

gcc -c hehe.c -o hehe.o

gcc -o hehe hehe.o

gcc -c haha.c -o haha.o

gcc -o haha haha.o

-rwxrwxr-x 1 normal normal 4940

12-11

16:08

haha

-rw-rw-r-- 1 normal normal 72

12-11

16:03

haha.c

-rw-rw-r-- 1 normal normal 872

12-11

16:08

haha.o

-rwxrwxr-x 1 normal normal 4940

12-11

16:08

hehe

-rw-rw-r-- 1 normal normal 72

12-11

16:03

hehe.c

-rw-rw-r-- 1 normal normal 872

12-11

16:08

hehe.o

-rw-rw-r-- 1 normal normal 279

12-11

16:04 makefil

這樣我們需要的程式就編譯出來了。檔案結構如下

makefile/

|--makefile

|--haha

|--haha.c

|--haha.o

|--hehe

|--hehe.c

`-- hehe.o

多出來了4個檔案,haha、haha.o、hehe、hehe.o

1.4、執行結果

$ ./haha 

ha ! ha !

$ ./hehe 

he ~ he ~

1.5 執行命令make clean,結果如下

$ make clean

rm -rf *.o

rm -rf hehe haha

多出來的檔案都被刪除了,接下來對makefile的指令碼檔案進行一下講解。

2、下面是對makefile檔案的講解

2.1、在make命令執行後,會在當前目錄下搜尋makefile、makefile。如果當前目錄沒有這個兩個檔案的話就會報錯:找不到makefile

$ make

make: *** 沒有指明目標並且找不到 makefile。 停止。

2.2、現在把makefile改名,用引數-f 來指定要載入的指令碼檔案也是可以順利編譯的。

$ mv makefile realmake

$ make -f realmake

gcc -c hehe.c -o hehe.o

gcc -o hehe hehe.o

gcc -c haha.c -o haha.o

gcc -o haha haha.o

2.3、在makefile指令碼中,make會預設尋找第乙個目標進行編譯。比如上面的makefile中,make會從上到下進行掃瞄,當掃瞄到「all :」的時候,終於找到乙個目標了,然後就會對這個目標進行操作。當make發現這個all需要$(all_files)的時候,時候就會去尋找$(all_files)。但是,make在載入指令碼的時候會把all_files變數進行置換為hehe haha,所以換成了尋找hehe和haha進行編譯。當執行hehe的時候又發現需要hehe.o,然後又去尋找hehe.o,如此迴圈尋找吧,直到hehe.c的時候,終於在當前目錄找到hehe.c了,這個呼叫棧才算到頭了。

Linux下gcc編譯過程例項講解

本次講解基於c 在ubuntu下編譯一段例項 詳細講解gcc的編譯過程。通過本教程,你將掌握linux下gcc編譯過程和原理。詳見我的部落格 linux下c c 編譯原理及過程 file main.c brief 測試 author zyf date 2020 12 09 23 28 20 vers...

Linux實現自動登入的例項講解

使用expechercxljjbt實現自動登入的指令碼,網上有很多,可是都沒有乙個明白的說明,初學者一般都是照抄 可是為什麼要這麼寫卻不知其然。本文用乙個最短的例子說明指令碼的原理。指令碼 如下 usr bin expect set timeout 30 spawn ssh l username 1...

Linux下安裝Redis及make安裝時所踩的坑

正常安裝步驟如下 root localhost yum install gcc root localhost cd usr local root localhost local wget root localhost local tar xvf redis 6.0.1.tar.gz root loc...