一个简单的例子讲解makefile

博主在做大型项目时积累了makefile和cmake相关经验,以简单例子介绍.hpp和.cpp在不同目录下用makefile编译的方法。还介绍了目录结构,以及makefile中wildcard、notdir、patsubst等用法,和$@、$^等符号含义,还有 -I、-L、-l 编译选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录结构:

本人最近在做一个比较大项目,涉及到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值