1

多くのサブディレクトリを持つ.cファイルをコンパイルするMakefileを作成する必要があり(ソースディレクトリは約5レベルの深さになります)、ミラー化されたビルドディレクトリにオブジェクトファイルを配置する必要があります。これまでのところ、私はこのMakefileを作成しました:

CC := gcc.exe
AS := as.exe

CFLAGS = -DCORE_SW_VERSION='"$(CORE_SW_VERSION)"' -Wall -mA6 -c -fmessage-length=0 -Hsdata0
CFLAGS += -fgnu89-inline -mno-volatile-cache $(INCLUDE)  -Hon=each_function_in_own_section -Xcrc -std=c99 -O1

CORE_SW_VERSION:=CORE.07.01.04.01.03.01.R
HAL_SW_VERSION:=16.01.06.01.06.00

MODE_CORE := dev
MODE_HAL := dev


OBJDIR := $(shell pwd)/$(TARGET12)  #TARGET12 is a make parameter
INCLUDE := $(shell cat ./$(TARGET12)_include.txt)
SOURCEDIR := ../sources

CSRC := $(shell find $(SOURCEDIR) -name '*.c')
EXCLUDES := $(shell cat ./$(TARGET12)_exclude.txt)

OBJ := $(CSRC:.c=.o)
OBJS := $(patsubst ../%.c,$(OBJDIR)/%.o,$(CSRC)) 


.PHONY: $(TARGET12)
$(TARGET12): $(OBJS)
    $(AR) -r $(CORE_SW_VERSION).a $(OBJS)   


$(OBJS): $(CSRC)
    mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $< -o $(patsubst ../%,$(OBJDIR)/%,$@)

$(OBJS)この方法でルールを定義すると、$<は常に。の最初の.cファイルになり$(CSRC)ます。

このように定義すると$(OBJS)

$(OBJS): %.o: %.c
    mkdir -p $(dir $@)
    $(CP) $< $@

.cファイルのターゲットを作成するルールがないというエラーが表示されます。しかし、makeはビルドミラーディレクトリで.cファイルを探しているので、ソースディレクトリを探す必要があります。これをどのように配置できるか知っていますか?

よろしくお願いします!

4

2 に答える 2

1

ルール$(OBJS): %.o: %.cは次のような意味です。ファイルを作成しようとするときに、対応するファイルが存在する.o場合はこのルールを使用します。.c例:makeがを作成する方法を探しているとき$(OBJDIR)/foo.o、それはを探します$(OBJDIR)/foo.c

あなたの場合、このファイルは存在しないため、ルールは無視されます。

あなたが欲しいのはむしろこのようなものです:

$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c
    mkdir -p $(dir $@)
    $(CP) $< $@
于 2011-04-13T15:15:15.233 に答える
0

あなたが試した最初のルール$(OBJS)は、すべてのオブジェクトファイルが個別にすべてのソースファイルに依存することを示しています。確かにそれは正しくありません。
レシピは奇妙ですが、2回目の試行の方が優れています。それを修正し、ソースを見つけるために使用VPATHします。make

于 2011-04-13T15:04:58.043 に答える