2016-04-22 17 views
6

我剛開始使用Google協議緩衝區開玩笑,我試圖將來自協議緩衝區編譯器的C++輸出文件合併到我的項目中。迄今爲止,我一直在爲我的項目使用一個簡單的makefile,它構建了所有共享相同擴展名的源文件。我使用「.cpp」作爲我的源文件,但Google Protocol Buffers輸出它的源文件爲「.pb.cc」文件。我需要能夠將兩種類型的源文件編譯並鏈接到一個可執行文件中。用於構建C++的Makefile用於構建C++的Google協議緩衝區項目

我一直在尋找和擺弄我的makefile幾個小時,現在沒有成功。

我目前的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 

我不是以書面的makefile太精通,所以我只是不太知道怎樣做才能使這項工作。

如果有幫助,我有GNU使4.1和gcc 5.3.1在Ubuntu 16.04測試版

+0

兩個小圖片的標題說明,最好使用內置變量,比如'$ @'(目標的名稱),或'$ ^'(空格分隔的列表目標的依賴關係)。另外,在鏈接對象之前,必須鏈接庫。 – 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只有嚴格依賴於製造,而不是周圍的外殼可以添加另一組SRCOBJ變量,這將作爲第二組依賴項。

添加第一套低於這些權利:

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:*** No rule to make target'buffer.o','aserv'需要。Stop。」 –

+1

現在,您正在使用make內置規則來構建.cpp文件,您必須創建一個用於構建.pb.cc文件的新規則。 @AlexZywicki看我的編輯。 – Leandros