我剛開始學linux的時候,並沒有用makefile。寫乙個test.c ,然後直接gcc -o -g test test.c。後來檔案一多,各種.c .h 檔案。原來的方法是沒法編譯的。所以這時候就要靠makefile。
先寫乙個簡單的例子吧。現在有一段**
稍微插一段編譯原理:首先你的.c到linux可執行檔案.elf 要經歷的過程是:.h .c->.i->.o->elf
其實是這樣:
gcc -e hello.c -o hello.i
gcc -s hello.i -o hello.s
gcc -c hello.s -o hello.o
現在動手寫乙個makefile 直接vim makefile
test 是目標檔案,而test.c是依賴檔案。下面的紅色字型是命令。在makefile中的命令,必須要以【tab】鍵開始!
想一想,linux核心成千個.c .h也這樣寫豈不是要累死!!!
如何寫乙個比較通用的makefile呢
先上乙個makefile再慢慢講解吧 !!!
src =$(wildcard *.c)紅色字型是makefile中的變數。使用變數的方式就是$(變數名) $@表示目標檔案 $^表示第乙個依賴檔案 翻譯一下:objs
=$(patsubst %.c,%.o,$(src))
cc
=gcc
cflags
= -wall -g
libs
= -lpthread
defs
=include = -i ./target =test
$(target):$(objs)
$(cc) $(cflags) $(defs) $(include) $@ -o $^$(libs)
.phony:clean
clean:
rm -rf *.o $(target)
$(cc) $(cflags) $(defs) $(include) $@ -o $^$(libs) ==gcc -wall -g -i ../ test -o test.c -lpthread
-i 表示加入的標頭檔案即$(include) 後面跟檔案路徑。 後面的$(libs)表示動態庫。注意一下,這只是我起的名字,隨便什麼都可以的。
.phony表示偽目標
生成clean。clean 執行的是刪除生成的檔案。如果當前資料夾沒有clean的檔案,其實也可以不用加.phony。
wildcard是makefile中的函式,放在這裡是取當前資料夾中的所有.c檔案。
一點點文字只能大致描述一下。很多地方都沒講到。比如1.已經編譯的乙個專案,需要改一點東西,這時候makefile只會重新編譯改了的檔案。makefile會自動根據檔案改動時間來判斷的。2.在多目錄結構下有多個makefile怎麼來編譯。等等。希望對讀者有些幫助!!
Linux下C語言程式設計基礎 Makefile
假設我們有下面這樣的乙個程式,源 如下 main.c include mytool1.h include mytool2.h int main int argc,char argv mytool1.h ifndef mytool 1 h define mytool 1 h void mytool1 ...
linux程式設計之mprotect
mmap 的第三個引數指定對記憶體區域的保護,由標記讀 寫 執行許可權的 prot read prot write 和 prot exec 按位與操作獲得,或者是限制沒有訪問許可權的 prot none。如果程式嘗試在不允許這些許可權的本地記憶體上操作,它將被 sigsegv 訊號 segmenta...
Linux程式設計之fork
fork 建立乙個子程序 建立失敗返回負值 同時會有不同的錯誤碼 errno eagain 系統程序個數限制 enomem 申請記憶體失敗 enosys 系統平台不支援 建立成功將會返回兩個值 0 子程序的返回值,說明當前程式在子程序執行 0 父程序的返回值,說明當前程式在父程序執行,返回值為生成子...