2016-04-22 3 views
6

Я только начал обманывать с помощью буферов протокола Google, и я пытаюсь включить выходные файлы C++ из компилятора буфера протокола в свой проект. До сих пор я использовал простой make-файл для своих проектов, и он делает трюк для создания исходных файлов, все используют одно и то же расширение. Я использую «.cpp» для своих исходных файлов, но буферы протокола Google выводят его как файлы «.pb.cc». Мне нужно иметь возможность компилировать и связывать оба типа исходных файлов в один исполняемый файл.Makefile для создания C++ Project Protocol Buffers Project

Я искал и прокручивал свой файл в течение нескольких часов и не имел успеха.

Мой текущий Makefile:

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 

Я не слишком хорошо разбирается в написании Makefiles, поэтому я просто не знаю, что нужно сделать, чтобы сделать эту работу.

Если это помогает я иметь GNU сделать 4.1 и GCC 5.3.1 на Ubuntu 16.04 бета

+0

Два маленьких sidenotes, то лучше использовать встроенные переменные, как '$ @' (имя цели), или '$^'(разделенных пробелами список зависимостей цели). Кроме того, файлы libs должны быть связаны до того, как ваши объекты будут связаны. – Leandros

ответ

2

Я не смог получить оригинал Makefile работать, поэтому я изменил несколько вещей, но я думаю, что сложная часть с этим - неявные правила, которые make генерирует для создания ваших файлов .o. Я думаю, что для файлов .pb.cc вам необходимо создать объекты .pb.o, чтобы имплицитные правила могли их сопоставлять.

Попробуйте это:

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

Если вы wanto только строго полагаться на Марка, а не окружающие оболочки вы можете добавить еще один набор SRC и OBJ переменных , который будет служить вторым набором зависимостей.

Добавить эти права ниже первого набора:

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

И изменить .depend и $(PROGRAM_NAME) правило:

.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

Я внедрил изменения, и я получаю сообщение об ошибке «make: *** Нет правила делать« buffer.o »цели, необходимо« aserv ». Остановитесь». –

+1

Теперь вы используете встроенное правило make для создания файлов .cpp, вам нужно будет создать новое правило для создания файлов .pb.cc. @AlexZywicki См. Мое редактирование. – Leandros