2015-05-04 8 views
1

Основной файл makefile это, как вы можете видеть, он вызывает два других make-файла в поддирементах: comm и bc.«нет правила для цели» для цели, созданной другим make-файлом

Я знаю, что я не использую makefile ярлыки, как обрабатывать все файлы cpp сразу, но, пожалуйста, не обращайте на это внимание прямо сейчас.

В comm/makefile есть правило сделать comm/build/Communication.o, но каким-то образом я не знаю, как сказать этот факт в основном make-файле.

CPPFLAGS=-g -c --std=c++11 -Iinc -I/usr/include -I/usr/include/qt5 -I/usr/include/qt5/QtCore -I/usr/include/boost -Ibc/inc -Icomm/inc 
LDFLAGS=-g -L/usr/lib/x86_64-linux-gnu/ -lQt5Core -lboost_system -lpthread -lboost_thread 

all: comm/bin/party bc/bin/bctest bin/protocol 

comm/bin/party: 
    cd comm && $(MAKE) 

bc/bin/bctest: 
    cd bc && $(MAKE) 

bin/protocol:build/main.o \ 
      build/TrustedParty.o \ 
      build/Player.o \ 
      build/utils.o \ 
      comm/build/Communication.o \ 
      comm/build/FileParser.o \ 
      comm/build/Party.o \ 
      comm/build/PeerConnection.o \ 
      comm/build/ServerModule.o \ 
      comm/build/Utilities.o \ 
      bc/build/BooleanCircuit.o \ 
      bc/build/Gate.o \ 
      bc/build/Wire.o 
    g++ -Wall $^ -o bin/protocol $(LDFLAGS) 


build/main.o:src/main.cpp 
    g++ $(CPPFLAGS) -fPIC src/main.cpp -o build/main.o 

build/TrustedParty.o:src/TrustedParty.cpp 
    g++ $(CPPFLAGS) src/TrustedParty.cpp -o build/TrustedParty.o 

build/Player.o:src/Player.cpp 
    g++ $(CPPFLAGS) src/Player.cpp -o build/Player.o 

build/utils.o:src/utils.cpp 
    g++ $(CPPFLAGS) src/utils.cpp -o build/utils.o 

clean: 
    rm -fr build/* bin/* 
    rm -fr comm/build/* bin/* 
    rm -fr bc/build/* bin/* 

Когда я бегу make возвращается

16:15:03 **** Build of configuration Default for project bmr **** 
make all 
g++ -g -c --std=c++11 -Iinc -I/usr/include -I/usr/include/qt5 -I/usr/include/qt5/QtCore -I/usr/include/boost -Ibc/inc -Icomm/inc -fPIC src/main.cpp -o build/main.o 
g++ -g -c --std=c++11 -Iinc -I/usr/include -I/usr/include/qt5 -I/usr/include/qt5/QtCore -I/usr/include/boost -Ibc/inc -Icomm/inc src/TrustedParty.cpp -o build/TrustedParty.o 
g++ -g -c --std=c++11 -Iinc -I/usr/include -I/usr/include/qt5 -I/usr/include/qt5/QtCore -I/usr/include/boost -Ibc/inc -Icomm/inc src/Player.cpp -o build/Player.o 
g++ -g -c --std=c++11 -Iinc -I/usr/include -I/usr/include/qt5 -I/usr/include/qt5/QtCore -I/usr/include/boost -Ibc/inc -Icomm/inc src/utils.cpp -o build/utils.o 
make: *** No rule to make target `comm/build/Communication.o', needed by `bin/protocol'. Stop. 

16:15:11 Build Finished (took 7s.821ms) 

ответ

0

Предполагая, что comm/Makefile знает, как построить эту цель правильно (make build/Communication.o в каталоге работ по comm); то, если вы действительно хотите, чтобы это работало правильно (и вы, возможно, не захотите, см. Recursive Make Considered Harmful, почему), вам нужно сообщить, что то, что нужно сделать в этой ситуации.

Что-то вроде этого:

comm/build/%.o: 
    @$(MAKE) -C comm $(patsubst comm/%,%,[email protected]) 
+0

любое предложение о том, как сделать правильный путь в первую очередь? (без добавления исправлений ..) – Bush

+0

Решение этой проблемы, не требующее такого исправления, состоит в том, чтобы прекратить использование рекурсивного make и начать с использования нерекурсивной системы make. Я еще не читал (но), но автор знает его вещи, поэтому [это] (http://www.cmcrossroads.com/article/painless-non-recursive-make) может быть полезной, но общая идея что у вас есть только один процесс make для всей сборки. –

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