make用來執行Makefilelinux
cmake是跨平臺項目管理工具,它用更抽象的語法來組織項目。雖然,仍然是目標,依賴之類的東西,但更爲抽象和友好,好比你可用math表示數學庫,而不須要再具體指定究竟是math.dll仍是libmath.so,在windows下它會支持生成visual studio的工程,在linux下它會生成Makefile,甚至它還能生成eclipse工程文件。也就是說,從同一個抽象規則出發,它爲各個編譯器定製工程文件。windows
具體使用時,Linux下,小工程可手動寫Makefile,大工程用automake來幫你生成Makefile,要想跨平臺,就用cmake。eclipse
make和cmake主要命令只有一條,make用於處理Makefile,cmake用來轉譯CMakeLists.txt工具
編寫makefileblog
使用變量改良版:ip
GNU的make很強大,它能夠自動推導文件以及文件依賴關係後面的命令,因而咱們就不必去在每個[.o]文件後都寫上相似的命令,由於,咱們的make會自動識別,並本身推導命令。項目管理
只要make看到一個[.o]文件,它就會自動的把[.c]文件加在依賴關係中,若是make找到一個whatever.o,那麼whatever.c,就會是whatever.o的依賴文件。而且 cc -c whatever.c 也會被推導出來,因而,咱們的makefile不再用寫得這麼複雜。咱們的是新的makefile又出爐了。get
繼續改進:編譯器
包含的頭文件也要填到依賴項裏,不然只更新了頭文件,make將不會更新。數學
makefile能夠按照時間戳來判斷文件是否須要從新編譯。
make是如何工做的
在默認的方式下,也就是咱們只輸入make命令。那麼,
一、make會在當前目錄下找名字叫「Makefile」或「makefile」的文件。
二、若是找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到「edit」這個文件,並把這個文件做爲最終的目標文件。
三、若是edit文件不存在,或是edit所依賴的後面的 .o 文件的文件修改時間要比edit這個文件新,那麼,他就會執行後面所定義的命令來生成edit這個文件。
四、若是edit所依賴的.o文件也存在,那麼make會在當前文件中找目標爲.o文件的依賴性,若是找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)
五、固然,你的C文件和H文件是存在的啦,因而make會生成 .o 文件,而後再用 .o 文件生命make的終極任務,也就是執行文件edit了。
這就是整個make的依賴性,make會一層又一層地去找文件的依賴關係,直到最終編譯出第一個目標文件。在找尋的過程當中,若是出現錯誤,好比最後被依賴的文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管文件的依賴性,即,若是在我找了依賴關係以後,冒號後面的文件仍是不在,那麼對不起,我就不工做啦。
經過上述分析,咱們知道,像clean這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,咱們能夠顯示要make執行。即命令——「make clean」,以此來清除全部的目標文件,以便重編譯。
咱們可使用C/C++編譯的一個功能。大多數的C/C++編譯器都支持一個「-M」的選項,即自動找尋源文件中包含的頭文件,並生成一個依賴關係。
gcc -M main.c的輸出是:
main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h /
/usr/include/sys/cdefs.h /usr/include/gnu/stubs.h /
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h /
/usr/include/bits/types.h /usr/include/bits/pthreadtypes.h /
/usr/include/bits/sched.h /usr/include/libio.h /
/usr/include/_G_config.h /usr/include/wchar.h /
/usr/include/bits/wchar.h /usr/include/gconv.h /
/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h /
/usr/include/bits/stdio_lim.h
gcc -MM main.c的輸出則是:
main.o: main.c defs.h
$@ 表示目標文件
$^ 表示全部的依賴文件
$< 表示第一個依賴文件
$? 表示比目標還要新的依賴文件列表