Скомпилируйте все файлы CPP, используя make-файл под MinGW

Структура каталогов моего 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

7

Решение

Добавьте список ваших исходных файлов:

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) ... должен быть символ табуляции, а не пробелы.

5

Другие решения

Ты можешь использовать 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/
1

По вопросам рекламы [email protected]