Я редактировал этот make-файл, но в основном это метод проб и ошибок.
В основном у меня есть n
.c файлы в той же директории.Я хочу, чтобы первый (с фиксированным именем) был скомпилирован и скомпонован с использованием моих хаков make-файлов, которые включают в себя различные файлы .o на этапе компоновки, а все остальные скомпилированы и скомпонованы с использованием только LIBS
(без других файлов .o).
Это основной make-файл:
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
И это Makefile.Release, который обрабатывает компиляцию / компоновку этих .cfiles.
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)
Это также дает выходному файлу имя главной папки (хотя я не понимаю, где он это делает?).
При связывании это приводит к ошибке «несколько основных» (у меня нет устройства ARM под рукой, поэтому я не могу предоставить полную ошибку).
Это иерархия папок, так что, надеюсь, я смогу решить все ваши сомнения ..
# Main folder (This is the name that the compiled exe has)
## Controllers
-- .c & .h files
-- Makefile
## Build-Assets
-- all .o go here to clean up the folders
- Makefile (The one I call)
- main.c (this needs to be compiled with the .o in build-assets, name can be either main or main folder)
- gcheck.c (this needs to be compiled with only the LIBS, name of executable should be filename)
- ... other .c files, same as gcheck.c