简单通用makefile 用来编译C++ 程序
makefile 变量小知识
makefile 文件注释用 #
自动变量(只能在规则的命令中使用(第二行))
$< : 规则中的第一个依赖
$@ : 规则中的目标
$^ : 规则中所有的依赖
CC: cc(即gcc)
CXX: g++
APPFLAGS:预处理使用的选项
CFLAGS: 编译的时候使用的选项
LDFLAGS: 链接库使用的选项
wildcard 查找当前目录下所有.c文件,返回值给src
src=$(wildcard ./*.c)
patsubst 替换所有.c文件为.o文件
obj=$(patsubst ./%.c, ./%.o, $(src))
通用makefile
.PHONY:clean all
CFLAGS=-Wall -std=c++11 -pthread -w
BIN=bin
SUBDIR=$(shell ls -d */)
ROOTSRC=$(wildcard *.cpp)
ROOTOBJ=$(ROOTSRC:%.cpp=%.o)
SUBSRC=$(shell find $(SUBDIR) -name '*.cpp')
SUBOBJ=$(SUBSRC:%.cpp=%.o)
$(BIN):$(ROOTOBJ) $(SUBOBJ)
$(CXX) $(CFLAGS) -o $@ $^
.cpp.o:
$(CXX) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o $(BIN) $(ROOTOBJ) $(SUBOBJ)
使用实例一:无子文件夹
使用实例二:有子文件夹
使用第三方库
以Dbus库为例:
.PHONY:clean all
CFLAGS=-Wall -std=c++11 -pthread -w
BIN=bridge
LIBS+=-l dbus-1
# LIBS_PATH += -L /******/Dbus/Install/dbus-1.10.20/lib
APPINCLUDE += -I./
APPINCLUDE += -I/usr/include/glib-2.0
APPINCLUDE += -I/usr/local/include/dbus-1.0/
APPINCLUDE += -I/usr/local/lib/dbus-1.0/include/
APPINCLUDE += -I/usr/include/dbus-1.0/
APPINCLUDE += -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/
APPINCLUDE += -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
SUBDIR=$(shell ls -d */)
ROOTSRC=$(wildcard *.cpp)
ROOTOBJ=$(ROOTSRC:%.cpp=%.o)
SUBSRC=$(shell find $(SUBDIR) -name '*.cpp')
SUBOBJ=$(SUBSRC:%.cpp=%.o)
$(BIN):$(ROOTOBJ) $(SUBOBJ)
$(CXX) $(CFLAGS) -o $@ $^ $(APPINCLUDE) $(LIBS)
.cpp.o:
$(CXX) $(CFLAGS) -c $< -o $@ $(APPINCLUDE)
clean:
rm -f *.o $(BIN) $(ROOTOBJ) $(SUBOBJ)