在vs當中,專案管理(多檔案管理),vs幫我們自動管理。
在linux中,維護專案檔案的工作,需要make,makefile來完成。
首先,需要明確的是,make和makefile是相互依賴的關係。make是執行依賴關係和依賴方法的命令,makefile是維護該機制的檔案,makefile裡面儲存的是專案的依賴結構。
要搞清楚依賴關係和依賴方法,我們還得明晰程式的編譯和鏈結。
一般來說,無論是c,還是c++,首先要把原始檔編譯成中間**檔案,在windows下也就是 .obj 檔案,linux下是 .o 檔案,即 object file,這個動作叫做編譯(compile)。然後再把大量的object file合成執行檔案,這個動作叫作鏈結(link)。
編譯時,編譯器需要檢查的是語法的正確,函式與變數的宣告的正確。通常你需要告訴編譯器標頭檔案的所在位置(標頭檔案中應該只是宣告,而定義應該放在c/c++檔案中),只要所有的語法正確,編譯器就可以編譯出中間目標檔案。一般來說,每個原始檔都應該對應於乙個中間目標檔案(o檔案或是obj檔案)。
鏈結時,主要是鏈結函式和全域性變數,所以,我們可以使用這些中間目標檔案(o檔案或是obj檔案)來鏈結我們的應用程式。鏈結器並不管函式所在的原始檔,只管函式的中間目標檔案(object file),在大多數時候,由於原始檔太多,編譯生成的中間目標檔案太多,而在鏈結時需要明顯地指出中間目標檔名,這對於編譯很不方便,所以,我們要給中間目標檔案打個包,在windows下這種包叫「庫檔案」(library file),也就是 .lib 檔案,在unix下,是archive file,也就是 .a 檔案
總結一下,原始檔首先會生成中間目標檔案,再由中間目標檔案生成執行檔案。在編譯時,編譯器只檢測程式語法,和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出乙個警告,但可以生成object file。而在鏈結程式時,鏈結器會在所有的object file中找尋函式的實現,如果找不到,那到就會報鏈結錯誤碼(linker error),在vc下,這種錯誤一般是:link 2001錯誤,意思說是說,鏈結器未能找到函式的實現。你需要指定函式的object file.
target … : prerequisites …
command
….phony:clean
clean:
rm -f target
其中:target 是目標檔案,prerequisites是目標檔案所依賴的檔案;
.phony:
1)後面常跟的都是偽目標。
2)表明目標總是被執行。
下面展示一些 簡單的**。
main:main.cc
g++ -o $@ $^
.phony:clean
clean:
rm -f main
其中$@指代的是目標檔案,即:左邊的main;
$^指代的是依賴檔案,即main.cc
在make中編寫我們需要的c++檔案即可。
make和makefile的更詳細使用,請參考: Makefile的簡單使用
簡介 乙個工程中的原始檔不計其數,其按型別 功能 模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些 檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell 指令碼一樣,其中也可以執行作業系統的命令。lin...
makefile的簡單使用
main.c include test1.h include test2.h include int main test1.c include test1.h include void test1 func char str test1.h ifndef test1 h define test1 h...
makefile的簡單使用
乙個工程中的原始檔不計其數,其按型別 功能 模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell指令碼一樣,其中也可以執行作業系統的命令。linux 環境...