我有一个裸机项目,其中包含 .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)
想想如果没有make
. 你会采取什么步骤?您首先创建哪些文件,文件如何在创建之前依赖于其他文件的存在?
一旦你清楚地了解了这一点,就可以编写模仿这些命令的 make 规则,但要包含 make 变量。
如果您已经解决了这个问题,那么您可以通过使用隐式规则、自动变量等内容来增强您的 makefile,但首先要保持简单,直到您掌握了make
工作原理。
几点:
make
的内置隐式或模式规则,这可能没问题,但它不会使用您要使用的 gcc 版本及其相关标志。您必须设置一些其他变量才能使其工作(例如CC
、CFLAGS
等)。LD
,但从未使用过它。在配方中使用它来创建可执行文件。我想你应该有更多这样的东西:
all: $(EXE)
$(EXE): $(OBJECTS_AS) $(OBJECTS_GCC)
$(LD) $^
%.o: %.s
$(AS) $<
%.o: %.c
$(GCC) -c $<
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8159 次 |
最近记录: |