用于构建C++ Google Protocol Buffers项目的Makefile

7
我刚开始尝试使用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

我对编写makefile不太熟悉,所以我不知道该怎么做才能让它工作。

如果有帮助的话,我在Ubuntu 16.04 beta上使用了GNU make 4.1和gcc 5.3.1。


两个小提示,最好使用内置变量,如$@(目标的名称)或$^(目标的依赖项列表)。此外,在链接对象之前必须先链接库。 - Leandros
2个回答

2
如果您希望只严格依赖于Make,而不是周围的shell,您可以添加另一组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 $@


%.o: %.c
    $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) -c -o $@ $<

我已经实施了更改,但是出现了错误:“make: *** No rule to make target 'buffer.o', needed by 'aserv'. Stop.” - Alex Zywicki
1
现在你正在使用一个用于构建.cpp文件的make内置规则,你需要创建一个新的规则来构建.pb.cc文件。@AlexZywicki请查看我的编辑。 - 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 $@ $^ $(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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接