2016-04-22 18 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