【问题标题】:Makefile for building C++ Google Protocol Buffers Project用于构建 C++ Google Protocol Buffers 项目的 Makefile
【发布时间】:2016-04-22 06:54:55
【问题描述】:

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

【问题讨论】:

  • 两个小注解,最好使用内置变量,例如$@(目标名称)或$^(以空格分隔的目标依赖项列表)。此外,必须在链接对象之前链接库。

标签: c++ makefile protocol-buffers gnu-make


【解决方案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)

【讨论】:

    【解决方案2】:

    如果您只想严格依赖 Make,而不是周围的 shell,您可以添加另一组 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 $@
    
    
    %.o: %.c
        $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) -c -o $@ $<
    

    【讨论】:

    • 我实施了更改并收到错误“make: *** No rule to make target 'buffer.o', required by 'aserv'. Stop.”
    • 现在您正在使用 make 内置规则来构建 .cpp 文件,您必须创建一个新规则来构建 .pb.cc 文件。 @AlexZywicki 查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多