参考:http://www.cnblogs.com/ycloneal/p/5230266.html
一个文件夹下面有list.cpp,list.h,Node.cpp,Node.h,主函数在test.cpp文件下面,最简单的makefile文件可以写成:
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
CFLAGS = `pkg-config --cflags lcm`
LDFLAGS=`pkg-config --libs lcm`\
-lpthread
OBJS = test.o \
list.o \
Node.o
TARGET = test
$(TARGET): $(OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
test.o: test.cpp
$(CXX) $(CFLAGS) -I. -o $@ -c $<
list.o: list.cpp
$(CXX) $(CFLAGS) -I. -o $@ -c $<
Node.o: Node.cpp
$(CXX) $(CFLAGS) -I. -o $@ -c $<
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
其中CXXFLAGS是编译参数变量,CXX是makefile内置变量,CXX默认表示g++(C++编译器)。这个makefile的有两个功能:①编译代码,将test.cpp,list.cpp,Node.cpp编译成test.o,list.o,Node.o并链接成test可执行文件;②清除项目,当项目需要重新编译或整理时,使用make clean命令即可清除生的OBJS和TARGET变量中的名称。
示例代码中出现了变量,makefile中变量采用$(变量)的方法使用,如$(TARGET)即表示test。该makefile的目的是生成名为test的可执行文件,即$(TARGET),它的依赖文件是$(OBJS)所代表的test.o、list.o、Node.o三个文件。由于这三个文件都未生成,故针对每一个文件都需要进行编译生成,所以有三个.o文件为目标的makefile语句。
文中特殊字符说明如下:$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。比如在如下的代码中,$@代表test.cpp,$<代表第一个依赖文件,也就是test.cpp。
test.o: test.cpp
$(CXX) $(CFLAGS) -I. -o $@ -c $<
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LIBS)
如下所示:
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
OBJS = test.o\
list.o\
Node.o
TARGET = test
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LIBS)
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
如果需要添加头文件,那么注意尽量不要使用makefile的自动推导功能,否则可能找不到头文件,则只需添加和修改如下代码:
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
OBJS = test.o\
list.o\
Node.o
HEADER_DIR =
TARGET = test
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LIBS)
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(HEADER_DIR) $(OBJS) -o $(TARGET) $(LIBS)