在 .c 文件旁边带有 .s 文件的 makefile

71G*_*1GA 2 linux makefile

我有一个裸机项目,其中包含 .c 文件旁边的 .s 文件。我想知道如何编写一个 makefile,在那里我将 .s 文件与 .c 文件分开编译。文件位于程序的子文件夹(源、包含、启动)中。我正在做这样的事情。这个好吗?那么如何将对象链接到 exe 中呢?

SHELL := /bin/bash
ROOT := $(shell pwd)
VPATH := $(ROOT)/source:/$(ROOT)/startup:$(ROOT)/include
EXE := exe
OBJECTS_GCC := $(patsubst %.c,%.o,$(wildcard *.c))
OBJECTS_AS := $(patsubst %.s,%.o,$(wildcard *.s))
AS := arm-none-eabi-as -mcpu=arm926ej-s -Wall
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -Wall
LD := arm-none-eabi-ld -T test.ld -o $(EXE)

all: $(EXE)
$(EXE): startups sources

startups: $(OBJECTS_AS)
    $(AS) $(OBJECTS_AS)

sources: $(OBJECTS_GCC)
    $(GCC) $(OBJECTS_GCC)
Run Code Online (Sandbox Code Playgroud)

我很难找到任何包含 .s 文件和 .c 文件的示例。

问候。


这是最新版本的 makefile,其中没有找到 header.h:

SHELL := /bin/bash
ROOT := $(shell pwd)
INC := $(ROOT)/inc
SRC := $(ROOT)/src
STR := $(ROOT)/str
EXE := exe
AS := arm-none-eabi-as -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR)
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR)
LDSCRIPT := test.ld
LD := arm-none-eabi-ld -T $(LDSCRIPT)
HEADERS := $(notdir $(wildcard $(INC)/*.h))
SOURCES_GCC := $(notdir $(wildcard $(SRC)/*.c))
SOURCES_AS := $(notdir $(wildcard $(STR)/*.s))
OBJECTS_GCC := $(SOURCES_GCC:.c=.o)
OBJECTS_AS := $(SOURCES_AS:.s=.o)
VPATH := $(STR):$(SRC):$(INC)

all : $(EXE)
    @echo konec postopka: izvrsljiv program po imenu $(EXE) se nahaja v mapi $(ROOT)

$(EXE) : $(OBJECTS_AS) $(OBJECTS_GCC)
    @echo objekti so: $(OBJECTS_AS) $(OBJECTS_GCC)
    @echo headerji so: $(HEADERS)
    @echo linkanje objektov v izvrsljiv program...
    $(LD) -o $@ $^

%.o : %.s %.h
    @echo prevajanje ASSEMBLY izvornih datotek...
    $(AS) -o $@  $<

%.o : %.c %.h
    @echo prevajanje C izvornih datotek...
    $(GCC) -o $@ $<

.PHONY : clean
clean :
    @echo brisanje objektov
    rm *.o
    @echo brisanje izvrsljivega programa
    rm $(EXE)
Run Code Online (Sandbox Code Playgroud)

eri*_*ous 5

想想如果没有make. 你会采取什么步骤?您首先创建哪些文件,文件如何在创建之前依赖于其他文件的存在?
一旦你清楚地了解了这一点,就可以编写模仿这些命令的 make 规则,但要包含 make 变量。

如果您已经解决了这个问题,那么您可以通过使用隐式规则、自动变量等内容来增强您的 makefile,但首先要保持简单,直到您掌握了make工作原理。

几点:

  • 我认为通配符函数不会以这种方式获取任何文件名。它只在当前目录中查找,不使用 VPATH 在其他目录中进行搜索。
  • 您将 gcc 与对象一起用作输入。这样它将(尝试)创建一个可执行文件。
  • 您没有创建目标文件的规则。如果您依赖make的内置隐式或模式规则,这可能没问题,但它不会使用您要使用的 gcc 版本及其相关标志。您必须设置一些其他变量才能使其工作(例如CCCFLAGS等)。
  • 您已经定义了LD,但从未使用过它。在配方中使用它来创建可执行文件。

我想你应该有更多这样的东西:

all: $(EXE)

$(EXE): $(OBJECTS_AS) $(OBJECTS_GCC)
    $(LD) $^

%.o: %.s
    $(AS) $<

%.o: %.c
    $(GCC) -c $<
Run Code Online (Sandbox Code Playgroud)