Структура каталогов моего C ++ проекта
/..
makefile <- the makefile is in root
/include <- subdirectory that has to be included while compiling
/obj <- target place for all *.o and final executable
/src <- sources
И мой текущий make-файл:
CC=g++
CFLAGS=-c -Wall -std=c++11
INC=-Iinclude
SRC=src
TGT=obj
all: myapp
myapp: myapp.o
$(CC) $(TGT)/myapp.o -o $(TGT)/myapp
myapp.o:
$(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o
clean:
rm -rf $(TGT)
mkdir $(TGT)
Это сработало для моего первого файла. Я новичок в makefile — помогите мне скомпилировать все файлы /src
каталог и связать их с исполняемым файлом в /obj
каталог.
make-файл должен работать под Windows, я использую MinGW и MSYS
Добавьте список ваших исходных файлов:
SOURCES = $(wildcard $(SRC)/*.cpp)
и список соответствующих объектных файлов:
OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))
и целевой исполняемый файл:
$(TGT)/myapp: $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $@
Правило для строительства объектов:
$(TGT)/%.o: $(SRC)/%.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
Теперь необходимо указать параметры g ++:
INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)
И все вместе
SRC=src
TGT=obj
INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)
SOURCES = $(wildcard $(SRC)/*.cpp)
OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))
$(TGT)/%.o: $(SRC)/%.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
$(TGT)/myapp: $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $@
Важно, чтобы перед $(CXX) ...
должен быть символ табуляции, а не пробелы.
Ты можешь использовать VPATH
для разделения исходных и объектных файлов:
src/myapp.c
obj/Makefile
Возьми свой существующий Makefile
переместить его в obj/
опустить ссылки на $(TGT)
а также $(SRC)
и добавьте следующее:
VPATH=../src
Обратите внимание, что если вы пытаетесь сделать мультиархитектурные сборки, VPATH
не идеал.
Кстати, вы не извлекаете выгоду из встроенные правила. Где у вас есть
CC=g++
CFLAGS=-c -Wall -std=c++11
myapp: myapp.o
$(CC) $(TGT)/myapp.o -o $(TGT)/myapp
myapp.o:
$(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o
вместо этого вы можете использовать:
CXXFLAGS=-Wall -std=c++11
CXXFLAGS+=$(INC)
LDLIBS+=-lstdc++
myapp: myapp.o
Итак, чтобы подвести итог, ваш новый obj/Makefile
должен выглядеть так:
VPATH=../src
INC=-I../include
CXXFLAGS=-Wall -std=c++11
CXXFLAGS+=$(INC)
LDLIBS+=-lstdc++
myapp: myapp.o
Вы можете создать другой Makefile
сверху obj/
вернуться в этот новый, если необходимо:
all: obj/myapp
obj/myapp:
mklink obj/Makefile ../Makefile
$(MAKE) --directory=obj/