在你可以用makefile做任何事情之前,你必須知道如何在沒有makefile的情況下做到這一點。
由於您使用的是gcc,我會假定您的源代碼是C++。
你還沒有告訴我們你的目錄結構是什麼樣子,所以我假設你在兩個目錄中有三個源文件:primary/main.cc
,other/foo.cc
和other/bar.cc
。 (我們可以在稍後處理類似foo.h
的頭文件。)並且您想構建myApp
。
STEP 1:做手工
要在一個命令做到這一點,您可以使用:
gcc -Wall primary/main.cc other/foo.cc other/bar.cc -o myApp
這將編譯三個源文件和二進制對象鏈接在一起成可執行文件myApp
。
STEP 2:做這捆柴(不要嘗試,直到你可以得到前面的步驟,完美地工作)
而是用一個命令建立的,你可以採取一箇中間步驟,編譯源文件轉換成二進制對象文件:
gcc -Wall -c primary/main.cc -o primary/main.o
gcc -Wall -c other/foo.cc -o other/foo.o
gcc -Wall -c other/bar.cc -o other/bar.o
這將產生alpha/main.o
,beta/foo.o
和beta/bar.o
。編譯器不會抱怨foo
和bar
缺少main()
函數,因爲目標文件不需要一個。 然後物體連接在一起成一個可執行文件:
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
第3步:做本地(不要嘗試,直到你可以得到前面的步驟,完美地工作。)
就像前面的步驟,但我們的行爲primary/
和other/
:
cd primary
gcc -Wall -c main.cc -o main.o
cd ../other
gcc -Wall -c foo.cc -o foo.o
gcc -Wall -c bar.cc -o bar.o
cd ..
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
步驟四:使用一個Makefile(在你完成上一步操作之前,不要嘗試這樣做。)
我們可以使用makefile執行STEP 1,但這並不是必須的。寫一個makefile到primary
(即primary/makefile
)是這樣的:
main.o:
gcc -Wall -c main.cc -o main.o
(在fromt gcc...
的空白是一個TAB)
現在試試這個:
cd primary
make
cd ../other
gcc -Wall -c foo.cc -o foo.o
gcc -Wall -c bar.cc -o bar.o
cd ..
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
STEP 5:使用一些Makefile文件(別試試這個,直到你可以完成上一步工作。)
寫一個other/makefile
:
both: foo.o bar.o
foo.o:
gcc -Wall -c foo.cc -o foo.o
bar.o:
gcc -Wall -c bar.cc -o bar.o
,並在頂級目錄下,你正在構建myApp
一個makefile:
myApp:
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
現在試試這個:
cd primary
make
cd ../other
make
cd ..
make
STEP 6:使用一個Makefile文件調用其他(不要嘗試這個,直到你可以完成上一步工作。)
編輯頂層Makefile:
myApp:
cd primary; make
cd other; make
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
現在試試:
make
如果所有這些工作,你有什麼是原油,但有效 makefile文件系統。當你準備好關閉訓練輪時,可能會有很多改進。
編輯:
如果有一個子目錄(如other/
)許多源文件,你不希望在保持手工頂層Makefile列表,有幾種方法來處理它。這是一個:
OTHER_SOURCES := $(wildcard other/*.cc)
OTHER_OBJECTS := $(OTHER_SOURCES:.cc=.o)
myApp:
cd primary; make
cd other; make
gcc -Wall primary/main.o $(OTHER_OBJECTS) -o myApp
但是,你應該讓這些makefiles工作和理解他們,然後再嘗試更多的精簡。
[Makefile與源文件在不同的目錄中]可能的副本(http://stackoverflow.com/questions/1139271/makefiles-with-source-files-in-different-directories) –