2015-03-24 3 views
0

У меня есть некоторые проблемы с попыткой поместить файлы .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 
+0

Я предполагаю, что вы имеете в виду, что марка не знает, как построить 'файлы .o' для исходных файлов более одного уровня под '$ (SRCDIR)'? Если это так, потому что у вас есть только одно правило шаблона для файлов в '$ (SRCDIR)'. –

+0

Да, это именно то, что я имел в виду :) Должен ли я писать одно правило для каждого уровня src? –

+0

На простейшем, да. Вероятно, есть более сложные решения (возможно, с помощью 'vpath'), которые могут позволить вам избежать этого, но стоит ли это того, что это другой вопрос. –

ответ

1

Вы можете попробовать это:

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=$(shell find . -name '*.cpp') 
TMP=$(subst $(SRCDIR),$(LIBDIR), $(SRC)) 
OBJ=$(patsubst %.cpp,%.o,$(TMP)) 

all: $(BIN) 

LTN: $(OBJ) 
    @[ ! -d $(BINDIR) ] & mkdir -p $(BINDIR) 
    $(CC) -o $(BINDIR)/[email protected] $^ $(LDFLAGS) 

$(LIBDIR)/%.o: $(SRCDIR)/%.cpp 
    @[ ! -d $(dir [email protected]) ] & mkdir -p $(dir [email protected]) 
    $(CC) -o [email protected] -c $< $(CFLAGS) 

.PHONY = clean 
+0

Спасибо за ваш ответ! Я просто попробовал, и он создает папку .o in/src, а не в/build :( –

+0

попробуйте еще раз и дайте мне обратную связь ~ – edwardramsey

+0

Еще раз спасибо! сделать все .o в нужном месте, но я получены некоторые ошибки: Неопределенные символы для архитектуры x86_64: ........................... (сообщение для почти каждого класса) ... ................. ПРИМЕЧАНИЕ. Отсутствующая версия vtable обычно означает, что первая неиннижная функция виртуального члена не имеет определения. «_main», ссылка от: неявная запись/начало для основного исполняемого файла ld: символ (-ы) не найден для архитектуры x86_64 clang: ошибка: команда компоновщика не удалась с кодом выхода 1 (используйте -v, чтобы увидеть вызов) ma ke: *** [LTN] Ошибка 1 –

Смежные вопросы