2016-02-22 64 views
0

我想寫我認爲是相當簡單的Makefile,我只是感到困惑!我不是一個生成文件的作家,但我認爲我足夠了解它們,以便能夠簡單地工作。與GCC Makefile拼搏

好的,我在一個目錄中有一個小項目,在這個目錄下也是一個包含許多.c文件的libs目錄。我想要做的是編寫一個makefile,將/ libs目錄的內容構建到/ libs目錄中的一個靜態lib文件中,然後編譯/目錄中的一些源文件並將其與建立的.a鏈接起來文件。

我敢肯定有人在會建議「爲什麼不使用cmake的」,但是這不回答我要找(波的手像絕地.. ehehehehe)

CC = gcc 
CFLAGS = -Wall 
SOURCES = lzx.c csum.c dirs.c listner.c tree.c 
OBJECTS = $(SOURCES:.c=.o) 
TARGETLIB = libs/mylib.a 
TARGET = TestApp 

libs/%.o : libs/%.c 
    $(CC) $CFLAGS -c $< 

$(TARGETLIB) : $(OBJECTS) 
    ar rcs [email protected] $^ 

$(TARGET) : 
    $(CC) $CFLAGS Source1.cpp Source2.cpp -llibs/mylib.a -o [email protected] 

我的理解是,第一個配方,將所有的.c文件編譯成對象,但它似乎編譯第一個.c文件,然後停止。

任何幫助任何人都可以給我,將不勝感激。

+0

請參閱[本](http://stackoverflow.com/a/16751650/841108)&[that](http://stackoverflow.com/a/26689798/841108)示例。使用'make'跟'make -trace'或[remake](http://bashdb.sourceforge.net/remake/)'-x'。使用$([patsubst](https://www.gnu.org/software/make/manual/html_node/Text-Functions.html)...);或者有一個內部'libs/Makefile'並使用'$(MAKE)-C libs' –

+0

感謝Basile,但我已經看過這些例子,儘管它們很接近,但它們並不完全符合我的要求試圖去做。我的主要問題是%.o:%.c在我的腦海裏應該編譯libs /目錄中的所有.c文件,但實際上只編譯列表中的第一個文件,然後因爲我無法解釋的原因而失敗。 make --trace是個好主意。 –

+0

所以'libs /'包含'lzx.c csum.c dirs.c listner.c tree.c',那些是你想要編譯和組合起來形成'libs/mylib.a'的文件,對嗎? – Beta

回答

2

由於您的最終應用程序是TARGET,因此您應該首先制定Makefile規則。而且,由於它也取決於TARGETLIB應給予的依賴,就像這樣:

$(TARGET): $(TARGETLIB) 
    $(CC) $(CFLAGS) Source1.cpp Source2.cpp -Lmylib -o [email protected] 
未來

我認爲你提到的* .c文件是LIB文件。因此你需要一個前綴給他們,因爲你想用手指定它們,而不是通過通配符或規則。這在我腦海

OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o) 

和最後一件事就是庫名,這應該是libSOMENAME.a(當然,這個名字在路徑和-Lotherpaths鏈接搜索)。因此,我們有:

TARGETLIB = libs/libmylib.a 

總結了這一切:

CC = gcc 
CFLAGS = -Wall 
SOURCES = lzx.c csum.c dirs.c listner.c tree.c 
OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o) 
TARGETLIB = libs/libmylib.a 
TARGET = TestApp 

$(TARGET) : $(TARGETLIB) 
    $(CC) $(CFLAGS) Source1.cpp Source2.cpp -static -L./libs -lmylib -o [email protected] 

$(TARGETLIB) : $(OBJECTS) 
    ar rcs [email protected] $^ 

是的,這個可以寫好多了,但我相信,如果你想了解更多有關生成文件或鏈接,而不是隻顯示你犯錯誤的地方,你會知道如何找到手冊頁。

+0

感謝您的建議和幫助,這是真的,我可以花更多時間閱讀make手冊,而不是在這裏問我的問題。我更希望這將是一個五分鐘的事情,而不是如此艱鉅。我確實嘗試了適合我在網上找到的例子,但現在很明顯,我對makefile的一些偏見是錯誤的。 –