2016-04-22 74 views
6

I Ho appena iniziato a scherzare usando i protocolli di protocollo di Google e sto cercando di incorporare i file di output C++ dal compilatore del protocollo buffer nel mio progetto. Ho utilizzato fino ad ora un semplice makefile per i miei progetti e fa il trucco per creare file di origine che condividono tutti la stessa estensione. Io uso ".cpp" per i miei file sorgente, ma Google Protocol Buffers restituisce l'origine come file ".pb.cc". Devo essere in grado di compilare e collegare entrambi i tipi di file sorgente in un unico eseguibile.Makefile per la creazione di C++ Protocollo di protocollo di Google Project

Sono stato a cercare e giocherellare con il mio makefile per un paio d'ore e non hanno avuto successo.

mio Makefile attuale:

PROGRAM_NAME=aserv 
CC=gcc 
CXX=g++ 
RM=rm -f 
CPPFLAGS=-g --std=c++14 -O3 -I/usr/local/include/ 
LDFLAGS=-g -L/usr/local/lib -L/usr/local/lib/boost 
LDLIBS= -lrtaudio -pthread -lboost_system -lprotobuf 

INSTALL_DIR = /usr/local/bin/ 

SRCS=$(wildcard *.cpp) 
OBJS=$(subst .cpp,.o,$(SRCS)) 


all: $(PROGRAM_NAME) 
$(PROGRAM_NAME): $(OBJS) 
    $(CXX) $(LDFLAGS) -o $(PROGRAM_NAME) $(OBJS) $(LDLIBS) 

depend: .depend 

.depend: $(SRCS) 
    rm -f ./.depend 
    $(CXX) $(CPPFLAGS) -MM $^>>./.depend; 

clean: 
    $(RM) $(OBJS) $(PROGRAM_NAME) .depend 
install: 
    cp $(PROGRAM_NAME) $(INSTALL_DIR)$(PROGRAM_NAME) 
uninstall: 
    $(RM) $(INSTALL_DIR)$(PROGRAM_NAME) 
dist-clean: clean 
    $(RM) *~ .depend 

include .depend 

non sto troppo bene addentro nella scrittura makefiles ancora, quindi ho solo che non so bene che cosa fare per fare questo lavoro.

se aiuta ho GNU make 4.1 e 5.3.1 gcc su Ubuntu 16.04 beta

+0

Due piccole note a margine, è meglio utilizzare built-in variabili, come '$ @' (il nome della destinazione), o '$ ^' (uno spazio separato elenco di dipendenze dell'obiettivo). Inoltre, le librerie devono essere collegate prima che i tuoi oggetti siano collegati. – Leandros

risposta

2

ho riusciti a trovare l'originale Makefile a lavorare così ho cambiato un paio di cose, ma io pensa che la parte difficile di questo è le regole implicite che make genera per creare i tuoi file .o. Penso che per i file .pb.cc è necessario generare gli oggetti .pb.o in modo che le regole implicite possano corrisponderli.

Prova questo:

PROGRAM_NAME = aserv 
CC = gcc 
CXX = g++ 
RM = rm -f 

CXXFLAGS = --std=c++14 -pthread -g -O3 -MMD -MP 
CPPFLAGS = -I/usr/local/include/ 
LDFLAGS = -L/usr/local/lib -L/usr/local/lib/boost 
LDLIBS = -lrtaudio -lboost_system -lprotobuf 

INSTALL_DIR = /usr/local/bin 

SRCS = $(wildcard *.cpp) $(wildcard *.pb.cc) 
OBJS = $(subst .pb.cc,.pb.o,$(subst .cpp,.o,$(SRCS))) 
DEPS = $(subst .pb.cc,.pb.d,$(subst .cpp,.d,$(SRCS))) 

all: $(PROGRAM_NAME) 

$(PROGRAM_NAME): $(OBJS) 
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 

-include $(DEPS) 

clean: 
    $(RM) $(OBJS) $(PROGRAM_NAME) 

install: 
    cp $(PROGRAM_NAME) $(INSTALL_DIR) 

uninstall: 
    $(RM) $(INSTALL_DIR)/$(PROGRAM_NAME) 

dist-clean: clean 
    $(RM) *~ $(DEPS) 
2

Se vuoi anche solo strettamente contare su fare, e non la shell circostante è possibile aggiungere un altro set di SRC e OBJ variabili , che fungerà da seconda serie di dipendenze.

Aggiungere questi proprio sotto il primo set:

SRC1=$(wildcard *.pb.cc) 
OBJ1=$(subst .pb.cc,.o,$(SRC1)) 

e modificare la .depend e $(PROGRAM_NAME) regola:

.depend: $(SRCS) $(SRC1) 


$(PROGRAM_NAME): $(OBJS) $(OBJ1) 
    $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o [email protected] 


%.o: %.c 
    $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) -c -o [email protected] $< 
+0

Ho implementato le modifiche e ottengo l'errore "make: *** Nessuna regola per rendere la destinazione 'buffer.o', necessaria per 'aserv'. –

+1

In questo momento stai usando una regola incorporata per costruire file .cpp, dovresti creare una nuova regola per creare file .pb.cc. @AlexZywicki Vedi la mia modifica. – Leandros

Problemi correlati