我刚刚开始使用Google协议缓冲区,我正在尝试将协议缓冲区编译器的C++输出文件合并到我的项目中。到目前为止,我一直在为我的项目使用一个简单的 makefile,它可以构建共享相同扩展名的源文件。我使用".cpp"作为我的源文件,但谷歌协议缓冲区将其源输出为".pb.cc"文件。我需要能够将两种类型的源文件编译并链接到一个可执行文件中。
我已经搜索和摆弄我的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 在 Ubuntu 16.04 测试版上制作 4.1 和 gcc 5.3.1
我无法让您的原始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)
如果你想只严格依赖 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 $@ $<