我正在制作一个用于在主机和基于手臂的微控制器之间进行交叉编译的makefile。那么,如何在makefile的配方中添加特定的库?
include sources.mk
ifeq ($(PLATFORM),MSP432)
# Platform Overrides
# Architectures Specific Flags
LINKER_FILE = msp432p401r.lds
CPU = cortex-m4
ARCH = thumb
SPECS = nosys.specs
CPP = -mcpu=$(CPU) -m$(ARCH) --specs=$(SPECS) -DMSP432
# Compiler Flags and Defines
CC = arm-none-eabi-gcc
LD = arm-none-eabi-ld
endif
ifeq ($(PLATFORM),HOST)
CC = gcc
CPP= DHOST
endif
TARGET =c1m2
LDFLAGS = -Wl,-Map=$(TARGET).map -T $(LINKER_FILE)
CFLAGS = -Wall -Werror -g -O0 -$(CPP) -I/Desktop/ese-coursera-
course1/assessments/m2/include/common/platform.h
-std=c99
.PHONY: build
build: all
.PHONY: all
all: $(TARGET).out
.PHONY: clean
clean:
rm -f $(OBJS) $(TARGET).out $(TARGET).map
%.o : %.c
$(CC) -c $< $(CFLAGS) -o $@
OBJS = $(SOURCES:.c=.o)
$(TARGET).out: $(OBJS)
$(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) -o $@
这是正确的方法吗?
我得到这个作为错误
main.c:23:10: fatal error: platform.h: No such file or directory
#include "platform.h"
^~~~~~~~~~~~
compilation terminated.
Makefile:67: recipe for target 'main.o' failed
make: *** [main.o] Error 1
这也是我的source.mk文件
SOURCES = Desktop/ese-coursera-course1/assessments/m2/src
# Add your include paths to this variable
INCLUDES = Desktop/ese-coursera-course1/assessments/m2/include/common/platform.h
谁能帮我吗?
最佳答案
首先,尝试确保您提供的所有路径都与Makefile有关。
我很惊讶您的编译器实际上会执行任何操作,因为您的SOURCES
变量是目录,而不是.c
文件列表。它可能看起来像:
SOURCES = src/main.c
这将使
OBJS
包含src/main.o
并且隐式规则将能够触发。接下来,
INCLUDES
变量应使用-I
标志引用目录,如下所示:INCLUDES = -Iinclude/common
然后,应在
CFLAGS
定义中使用它,如下所示:CFLAGS = -Wall -Werror -g -O0 -$(CPP) $(INCLUDES) -std=c99
我注意到的其他事项:
即使在主机情况下,LDFLAGS也无条件使用
msp432p401r.lds
链接描述文件。可能应该有条件地将其添加到ifeq
块中,如下所示:LDFLAGS += -T msp432p401r.lds
。您应注意不要稍后用LDFLAGS=
覆盖LDFLAGS,因此最好将CFLAGS和LDFLAGS的定义移到文件顶部,或者始终使用+=
修改这些变量。接下来:如果链接步骤使用链接描述文件,则应添加一个明确的规则来编码此依赖项:
$(TARGET).out: $(LINKER_FILE)
。build -> all -> $(TARGET).out
依赖项链有点多余。为什么不让build
直接依赖$(TARGET).out
?关于c - 如何将库路径添加到Makefile?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59208971/