2016-04-22 38 views
6

Google Protokolü Arabelleklerini kullanarak dalga geçmeye başladım ve protokol arabellek derleyicisinden C++ çıktı dosyalarını projeme dahil etmeye çalışıyorum. Projelerim için şu ana kadar basit bir makefile kullanmıştım ve hepsi aynı uzantıyı paylaşan kaynak dosyaları oluşturmanın hilesiydi. Kaynak dosyam için ".cpp" kullanıyorum, ancak Google Protokolü Arabellekleri kaynağını ".pb.cc" dosyaları olarak veriyor. Her iki kaynak dosya türünü tek bir yürütülebilir dosyaya derleyebilmem ve bağlayabilmem gerekir.Bina için Makefile C++ Google Protokolü Arabellekleri Projesi

Şimdiye kadar birkaç saat boyunca makefile ile uğraşıyor ve etrafta dolaşıyor ve başarı elde edemedim.

Benim Güncel 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 

Onu çok iyi yazma makefiles usta değilim henüz, bu yüzden sadece oldukça bu işi yapmak için ne bilmiyorum.

bu i GNU Ubuntu 16.04 Beta üzerinde 4.1 ve gcc 5.3.1 yapmak zorunda yardımcı olursa

+0

İki küçük sidenotes, kullanımı daha iyidir Yerleşik değişkenler, '$ @' (hedefin adı) veya '$ ^' (boşluk ayrılmış liste gibi hedefin bağımlılıkları). Ayrıca, lib'lerin nesneleriniz birbirine bağlanmadan önce bağlanması gerekir. – Leandros

cevap

2

bir kaç şey değişti ama Bu zor kısmı, .o dosyalarınızı oluşturmak için oluşturduğu örtük kuralları olduğunu düşünün. Ben .pb.o nesneleri oluşturmak için gereken .pb.cc dosyaları için bence örtük kurallar bunları eşleştirebilirsiniz.

bu deneyin:

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

sadece harfiyen wanto Eğer Make itimat ve çevresindeki kabuk sen SRC ve OBJ değişkenlerin başka bir set ekleyebilirsiniz değil ikinci bağımlılık grubu olarak hizmet edecek. .depend ve $(PROGRAM_NAME) kural

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

Ve değiştirin::

ilk sette Aşağıda, bu hakkı ekle ben Makefile orijinal için iş yerlerine senin alamadım

.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

Değişiklikleri uyguladım ve hatayı alıyorum "make: *** '' aserv '' tarafından ihtiyaç duyulan 'buffer.o' hedeflemesi yapmak için bir kural yok. –

+1

Şu anda .cpp dosyaları oluşturmak için yerleşik bir kural oluşturuyorsanız, .pb.cc dosyaları oluşturmak için yeni bir kural oluşturmanız gerekir. @AlexZywicki Düzenleme bölümüne bakın. – Leandros