[英]Struggling with a GCC Makefile
我試圖寫出我認為將是一個簡單的Makefile的文件,但我感到莫名其妙! 我不是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 $@ $^
$(TARGET) :
$(CC) $CFLAGS Source1.cpp Source2.cpp -llibs/mylib.a -o $@
我的理解是,第一個配方會將所有.c文件編譯成對象,但似乎先編譯第一個.c文件然后停止。
任何人都可以給我的幫助將不勝感激。
由於您的最終應用程序是TARGET,因此應首先使其成為Makefile規則。 並且由於它也依賴於TARGETLIB,因此應將其作為依賴項,例如:
$(TARGET): $(TARGETLIB)
$(CC) $(CFLAGS) Source1.cpp Source2.cpp -Lmylib -o $@
接下來,我假設您提到的* .c文件是lib文件。 因此,您將需要為其添加前綴,因為您希望手動指定它們,而不是通配符或規則。
OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o)
最后我想到的是庫名,它應該是libSOMENAME.a(好吧,鏈接程序在path和-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 $@
$(TARGETLIB) : $(OBJECTS)
ar rcs $@ $^
是的,這可以寫得更好,但是我想如果您想了解更多關於Makefiles或鏈接器的信息,而不僅僅是顯示您在哪里出錯,您將知道如何找到手冊頁。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.