Мне не ясно, как этот make-файл может работать так же, как и он, учитывая, что вы не сказали ему, где найти исходные файлы (если вы не сделали этого в одном из разделов elised).
В этих правилах:
$(BIN)/%.o:%.c
$(CC) $(CFLAGS) -c $<
$(BIN)/%.o:%.cpp
$(CXX) $(CXXFLAGS) -c $<
вы указываете компилятору создавать объектные файлы, но вы не указываете где для их построения, и по умолчанию это сборка в рабочем каталоге. Вы можете переопределить это с помощью опции -o :
$(BIN)/%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
$(BIN)/%.o:%.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
Как только у вас есть объектные файлы, где вы хотите их (bin/
), вы должны убедиться, что правило связывания:
$(TARGET_EXE):$(OBJECTS)
$(LINKER) $(LDFLAGS) -L. $^ -o $@
может найти их. Лучший способ сделать это - убедиться, что OBJECTS
содержит правильные пути к объектным файлам. Я не уверен, как вам посоветовать это сделать, поскольку, судя по вашему make-файлу, эта переменная может не содержать того, что вы думаете.
EDIT:
Давайте рассмотрим это поэтапно.
Предположим, у нас есть исходный файл, src/foo.c
. То, что мы хотим, это:
src/foo.c -> bin/foo.o
bin/foo.o -> foo
Это требует двух правил, которые мы можем написать так:
$(BIN)/%.o: src/%.c
$(CC) $(CFLAGS) -c $< -o $@
$(TARGET_EXE): bin/foo.o
$(LINKER) $(LDFLAGS) -L. $^ -o $@
На самом деле у нас много исходных файлов, некоторые из которых являются файлами C ++. Поэтому у нас должно быть правило для них:
$(BIN)/%.o: src/%.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
и составьте более длинный список объектов:
OBJECTS := bin/foo.o bin/bar.o bin/baz.o bin/quartz.o...
$(TARGET_EXE): $(OBJECTS)
$(LINKER) $(LDFLAGS) -L. $^ -o $@
(Смешивание C и C ++ мне кажется вредным, но не берите в голову.)
А как нам построить этот список объектов? Мы должны начать со списка источников, которые wildcard
может произвести:
SRC := src
C_SOURCES := $(wildcard $(SRC/*.c)
# this is src/foo.c src/bar.c
SRC := src
CPP_SOURCES := $(wildcard $(SRC/*.cpp)
# this is src/baz.cpp src/quartz.cpp
и затем преобразовать их в имена файлов объектов, которые мы на самом деле хотим:
BIN := bin
OBJECTS := $(patsubst $(SRC)/%.cpp,$(BIN)/%.o, $(CPP_SOURCES))
OBJECTS += $(patsubst $(SRC)/%.c,$(BIN)/%.o, $(C_SOURCES))
# this is bin/foo.o bin/bar.o bin/baz.o bin/quartz.o
Это должно дать вам желаемый эффект, и если вы поймете его, вы поймете, почему ваш старый make-файл этого не сделал.