簡體   English   中英

Makefile通用目標規則

[英]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 但是,如果我嘗試首先調用編譯為makemake first ,則使用隱式規則。

我嘗試過Makefile手冊,但那里確實有很多信息,我有點困惑。

如何修改Makefile以允許調用構建單獨的目標作為make <target>或所有目標作為make同時生成?

您描述問題的段落非常混亂且難以理解。 在提出問題時,請確保描述問題的部分最清楚:如果您提供樣本輸出,確切地顯示您鍵入的命令和獲得的結果,並解釋您希望獲得的內容,則會很有幫助。

然而,我的解釋是,如果你運行make first ,它使用內置的規則編譯first直接從first.c ,而不是你的模式規則(請注意,內置的規則,你的模式規則都被認為是“潛規則“)。

這是因為make將選擇“更短”的隱式規則鏈,因此直接從源構建可執行文件的規則,在一個步驟中,而不是構建對象,然后在兩個步驟中構建可執行文件,將是首選。 如果您不想使用內置隱式規則,則需要使用-r標志調用make,否則通過添加以下內容來刪除它

% : %.c

(只是)你的makefile。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM