我一直在编辑此生成的文件,但它主要是试验和错误。
基本上我有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)
答案 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
功能,或类似的东西。