[英]Makefile generic target rule
我正在嘗試改進天真的解決方案(用於編譯目標的單個規則和用於將所有先前目標鏈接在一起的附加規則),我使用了我的makefile。 我想出了以下Makefile(剪輯):
.PHONY: clean
BASE_DIR = ../
CC = gcc
CROSS_COMPILE = arm-none-eabi-
CFLAGS =-g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib
SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)
all: $(EXECUTABLE)
%:
${CROSS_COMPILE}$(CC) $(CFLAGS) $(LDFLAGS) $*.c -o $*
clean:
rm ${EXECUTABLE}
這工作正常,但我想分開編譯和鏈接過程。 因此我嘗試將其修改如下:
.PHONY: clean
BASE_DIR = ../
CC = gcc
CROSS_COMPILE = arm-none-eabi-
CFLAGS =-c -g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib
SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)
all : $(EXECUTABLE)
%.o : %.c
@echo "Compiling c file into o file"
${CROSS_COMPILE}$(CC) $(CFLAGS) $< -o $@
% : %.o
@echo "Linking o file into executable"
${CROSS_COMPILE}$(CC) $(LDFLAGS) $< -o $@
clean:
rm ${EXECUTABLE}
這工作正常然后我調用Makefile,例如make first.o; make first
make first.o; make first
或如果我將EXECUTABLE = $(OBJECTS:.o=)
為EXECUTABLE = $(OBJECTS:.o=.out)
和% : %.o
為%.out : %.o
。 %.out : %.o
。 但是,如果我嘗試首先調用編譯為make
或make first
,則使用隱式規則。
我嘗試過Makefile手冊,但那里確實有很多信息,我有點困惑。
如何修改Makefile以允許調用構建單獨的目標作為make <target>
或所有目標作為make
同時生成?
您描述問題的段落非常混亂且難以理解。 在提出問題時,請確保描述問題的部分最清楚:如果您提供樣本輸出,確切地顯示您鍵入的命令和獲得的結果,並解釋您希望獲得的內容,則會很有幫助。
然而,我的解釋是,如果你運行make first
,它使用內置的規則編譯first
直接從first.c
,而不是你的模式規則(請注意,內置的規則,你的模式規則都被認為是“潛規則“)。
這是因為make將選擇“更短”的隱式規則鏈,因此直接從源構建可執行文件的規則,在一個步驟中,而不是構建對象,然后在兩個步驟中構建可執行文件,將是首選。 如果您不想使用內置隱式規則,則需要使用-r
標志調用make,否則通過添加以下內容來刪除它 :
% : %.c
(只是)你的makefile。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.