У меня есть некоторые проблемы с попыткой поместить файлы .o в отдельный каталог (/ build). На самом деле, мои источники (в/src) содержат некоторые подкаталоги, и мой Makefile создает только .o файла .cpp, содержащегося на первом «уровне». Другие .o просто игнорируются, поэтому цель не может быть создана. В моем каталоге/src у меня есть «три уровня» (src/first/second /). Вот код Makefile:C++ Makefile. .o в разных подкаталогах
CC=g++
CFLAGS=-W -Wall -ansi -pedantic -s -O3 -Os -std=c++11 -fpermissive
LDFLAGS= -lboost_system -lboost_regex
SRCDIR=src
HEADDIR=include
LIBDIR=build
BINDIR=bin
BIN=LTN
SRC = $(wildcard src/*.cpp src/*/*.cpp src/*/*/*.cpp)
OBJ = $(patsubst %.cpp,$(LIBDIR)/%.o,$(SRC))
all: $(BIN)
LTN: $(OBJ)
$(CC) -o $(BINDIR)/[email protected] $^ $(LDFLAGS)
$(LIBDIR)/$(SRCDIR)/%.o: $(SRCDIR)/%.cpp $(HEADDIR)/%.h
$(CC) -o [email protected] -c $< $(CFLAGS)
.PHONY = clean
Я предполагаю, что вы имеете в виду, что марка не знает, как построить 'файлы .o' для исходных файлов более одного уровня под '$ (SRCDIR)'? Если это так, потому что у вас есть только одно правило шаблона для файлов в '$ (SRCDIR)'. –
Да, это именно то, что я имел в виду :) Должен ли я писать одно правило для каждого уровня src? –
На простейшем, да. Вероятно, есть более сложные решения (возможно, с помощью 'vpath'), которые могут позволить вам избежать этого, но стоит ли это того, что это другой вопрос. –