【发布时间】:2015-07-14 03:40:45
【问题描述】:
我编写了一个简单的 Makefile 来编译几种类型的源代码。而且效果很好。此 Makefile 将找到所有 protobuf 源和 C++ 源。所以制作程序将如下所示。
-
protoc将生成带有*.proto的C++源文件 -
g++将使用*.cpp和*.pb.cc编译目标文件(由步骤 1 生成) -
g++(实际上是ld)会将所有对象*.obj链接到一个单个可执行文件
这个 Makefile 示例是:
# Define the protoc generator
PROTOC = protoc
INCLUDE = -I$(SOMEPLACE)
LIB = -lxml2 -lpthread -lz
# The final single outputted executable
OUTPUT = svrkit_adapter_v2
# Define the cpp source code/object result
SOURCES = $(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
# Define the proto's source/generated result/object result
PROTO_SOURCES = $(wildcard *.proto)
PROTO_CPPSRC = $(patsubst %.proto,%.pb.cc,$(PROTO_SOURCES))
PROTO_OBJECT = $(patsubst %.proto,%.pb.o,$(PROTO_SOURCES))
# First actual making target
all:$(OUTPUT)
# Define the rule for generating proto's cpp sources
$(PROTO_CPPSRC) : $(PROTO_SOURCES)
$(PROTOC) --cpp_out=. $(filter %.proto, $^)
# Define the rule for compiling generated proto cpp sources
$(PROTO_OBJECT) : $(PROTO_CPPSRC)
$(CXX) $(CPPFLAGS) $(INCLUDE) -c $(filter %.cc, $^)
# Define the rule for compiling other cpp sources
$(OBJECTS): $(SOURCES) $(PROTO_OBJECT)
$(CXX) $(CPPFLAGS) $(INCLUDE) -c $(filter %.cpp, $^)
# Define the rule for linking the final executable
$(OUTPUT): $(OBJECTS) $(PROTO_OBJECT)
$(CXX) $(CFLAGS) -o $@ $^ ${LIB}
clean:
rm -f *.o *.~ *.bak *.pb.*
rm -f $(OUTPUT)
但是make执行的命令行如下(例如):
protoc a.proto b.proto
g++ -c a.pb.cc b.pb.cc
g++ -c x.cpp y.cpp z.cpp
g++ -o output a.o b.o x.o y.o z.o
有时效果很好。 但是如果源太多,重新编译一些没有变化的源会花费很多时间。比如我刚刚修改了a.proto,Makefile也会重新编译b.proto。
我的问题是:如何使每个源文件单独编译/生成。执行的命令行应该是:
protoc a.proto
protoc b.proto
g++ -c a.pb.cc -o a.o
g++ -c b.pb.cc -o b.o
g++ -c x.cpp -o x.o
g++ -c y.cpp -o y.o
g++ -c z.cpp -o z.o
g++ -o output a.o b.o x.o y.o z.o
提前致谢。
【问题讨论】:
标签: makefile