用于构建C++ Google协议缓冲区项目的Makefile

Ale*_*cki 6 c++ makefile gnu-make protocol-buffers

我刚开始使用Google Protocol Buffers,我试图将协议缓冲编译器中的C++输出文件合并到我的项目中.到目前为止,我已经为我的项目使用了一个简单的makefile,它可以构建所有共享相同扩展名的源文件.我使用".cpp"作为源文件,但Google Protocol Buffers将其源代码输出为".pb.cc"文件.我需要能够将两种类型的源文件编译并链接到一个可执行文件中.

我一直在搜索和摆弄我的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
Run Code Online (Sandbox Code Playgroud)

我还不太精通编写makefile,所以我只是不知道该怎么做才能使这个工作.

如果它有助于我在Ubuntu 16.04 beta上使用GNU make 4.1和gcc 5.3.1

Gal*_*lik 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 $@ $^ $(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)
Run Code Online (Sandbox Code Playgroud)