目录结构:
本人最近在做一个比较大项目,涉及到makefile和cmake等,现在把自己的一些经验写一下。我用一个简单的例子来介绍,.hpp .cpp在不同目录下时如何用一个makefile来编译它们。我的目录是这样的:
介绍一下目录结构:
inlcude存放头文件.h或.hpp
src存放资源文件.cpp
obj存放目标文件.o
bin存放可执行文件
makefile:
#定义各个文件夹的目录
DIR_INC = include
DIR_SRC = src
DIR_OBJ = obj
DIR_BIN = bin
#获取src目录下的所有cpp文件路径
SRC = $(wildcard ${DIR_SRC}/*.cpp)
#将上边的cpp全部转换为.o
OBJ = $(patsubst %.cpp,${DIR_OBJ}/%.o,$(notdir ${SRC}))
#最终的目标文件
TARGET = main
目标文件目录/bin/main
BIN_TARGET = ${DIR_BIN}/${TARGET}
#使用g++编译
CC = g++
# -g调试选项 -wall输出警告 -I 包含的头文件目录
CFLAGS = -g -Wall -I ${DIR_INC}
#目标文件main,依赖/obj下的所有.o文件
${BIN_TARGET}:${OBJ}
$(CC) $^ -o $@
#目标文件obj下的.o,依赖src文件下的.cpp -c是只编译不链接
${DIR_OBJ}/%.o:${DIR_SRC}/%.cpp
$(CC) $(CFLAGS) -c $^ -o $@
.PHONY:clean
clean:
rm -f /obj/*.o
rm -f /bin/main
首先是wildcard、notdir、patsubst:
wildcard:返回匹配的所有文件
notdir:去除路径
patsubst:替换通配符
Makefile中的符号$@, $^, $< 的意思:
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
-I(大写i) -L(大写的L) -l(-l小写的L)
-
-I /home/hello/include,表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include
- 也就是指定优先查找的目录,找不到的话查找默认目录
-
-L /home/hello/lib,表示将/home/hello/lib目录作为第一个寻找库文件的目录, 寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib
- 同上,也是指定优先查找的目录
-
-l word , 表示**寻找动态链接库文件**libword.so(也就是文件名去掉前缀和后缀所代表的库文件)
- 如果 加上编译选项-static,表示寻找静态链接库文件,也就是libword.a