稍微了解并修改此Makefile

时间:2019-02-02 10:33:17

标签: makefile

我一直在编辑此生成的文件,但它主要是试验和错误。

基本上我有n .C在相同的目录中的文件。我希望使用我的makefile hack编译和链接第一个(具有固定名称),在链接步骤中合并不同的.o文件,而所有其他文件仅使用{{1}进行编译和链接。 }(没有其他.o文件)。

这是 '主' 生成文件:

LIBS

和这是“Makefile.Release”处理该编译/那些.c文件的链接。

MAKEFILE_BASE = ./Build-Assets/Makefile
MAKEFILE_CONTROLLERS = ./Controllers/Makefile

.PHONY: default clean release release-clean

default: release

clean: release-clean

release:
    $(MAKE) -f $(MAKEFILE_CONTROLLERS) # This generates the .o files, and it works well
    $(MAKE) -f $(MAKEFILE_BASE).Release

release-clean:
    $(MAKE) -f $(MAKEFILE_BASE).Release clean

这也给了输出文件的主文件夹的名称(虽然我不明白的地方他这样做?)。

当链接,这将引发的“多个主”的错误(我不手边的ARM装置,所以无法提供完整的错误)。

这是文件夹层次结构,以便希望我能解决您的所有疑问。

TARGET = $(notdir $(shell pwd))

LIBS = -lm -lev3dev-c -pthread
D_BIN = Build-Assets

ifeq ($(OS),Windows_NT)
LIBS := $(LIBS) -lws2_32
D_BIN := $(D_BIN)/mingw
endif

D_H = ../../source/ev3
CFLAGS = $(addprefix -I, $(D_H)) -O2 -std=gnu99 -W -Wall -Wno-comment

ifeq ($(OS),Windows_NT)
CC = gcc
else
CC = arm-linux-gnueabi-gcc
endif

ifeq ($(OS),Windows_NT)
E_BIN = .exe
else
E_BIN =
endif

F_BIN = $(TARGET)$(E_BIN)

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c))) $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard Controllers/*.c)))

.PHONY: default all clean

default: $(F_BIN)
all: default

$(OBJECTS): $(D_BIN)/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(F_BIN) $(OBJECTS)

$(F_BIN): $(OBJECTS)
    $(info    VAR is $@)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f $(D_BIN)/*.o
    -rm -f $(F_BIN)

1 个答案:

答案 0 :(得分:1)

关于“里的目标名称为目录名”从何而来,它在这里:

T_t = T_t + R_t * translationVector';
R_t = R_t * rotationMatrix';
location = vertcat(location,[T_t(1),T_t(3)]);

这将运行shell命令R_t = rotationMatrix * R_t; T_t = T_t + (R_t * translationVector'); location = horzcat(location, T_t); 以获取当前目录的完整路径,然后使用TARGET = $(notdir $(shell pwd)) 剥离父目录。然后该规则链接可执行用途这样的:

pwd

至于为什么你得到多个主要的错误,那是因为你添加了新的notdir文件中的新F_BIN = $(TARGET)$(E_BIN) ... $(F_BIN): $(OBJECTS) 到同一目录而非makefile文件列出一组特定的源文件的编译和链接,它使用.c来抓取 all 所有源文件:

main

这些wildcard函数将扩展到这些目录中的所有OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c))) $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard Controllers/*.c))) 文件,包括您添加的所有新文件。然后将它们全部链接到目标,这将为您提供两个包含$(wildcard *.c)的不同目标文件。

您必须更改此设置到列表中你想要的文件,或者把你的文件别处,或者使用从列表中删除你的文件中所做的*.c功能,或类似的东西。