Makefile模板

文件结构如下:

其中,前两个.so文件为动态库文件(还是静态库?),.h文件都是库的头文件,.cpp文件是我使用的调用文件

makefile编写如下:

ofd_test:OFD_test.cpp ofdsdk.h
    g++ OFD_test.cpp ofdsdk.h -o ofd_test -lsw3 -lswofdsdk

.PHONY:clean
clean:
    rm -r ofd_test

这是最简单的一种写法,下面是一种通用的makefile写法

首先是文件结构:

对应的makefile文件

DIR_INC=./include
DIR_SRC=./src
DIR_OBJ=./obj
DIR_BIN=./bin
DIR_LIB=./lib

LIBS=-lsw3 -lswofdsdk

SRC = $(wildcard ${DIR_SRC}/*.cpp)
OBJ = $(patsubst %.cpp, ${DIR_OBJ}/%.o, $(notdir ${SRC}))

TARGET=ofd_test
BIN_TARGET=$(DIR_BIN)/$(TARGET)
INCLUDE=-I ${DIR_INC}
CFLAGS = -g -Wall 

${BIN_TARGET}:${OBJ}
    g++  ${CFLAGS} ${INCLUDE} ${OBJ} ${LIBS} -o $@

${DIR_OBJ}/%.o:${DIR_SRC}/%.cpp 
    g++ ${CFLAGS} ${INCLUDE} -c $< -o $@

.PHONY:clean
clean:
    rm -rf ${DIR_OBJ}/*.o ${BIN_TARGET}

ps:makefile1是测试失败的文件,不用管。

makefile介绍

1.带 = 号的都是赋值操作,可以使用 $() 或者 ${} 把赋予其中的变量值给取出来。

2.wildcard和patsubst是两个makfile格式的函数,作用是匹配和替换作用。

  其中两句代码的意思是:

  把./src 文件夹下的所有 .cpp文件名都赋予 SRC变量

  把SRC里面的所有.cpp文件名都替换成 .o文件名 赋给 OBJ 变量

在该实例中,SRC = OFD_test.cpp OBJ = OFD_test.o

如果有多个cpp文件,比如多个 main.cpp 那么对应的 SRC = OFD_test.cpp main.cpp OBJ = OFD_test.o main.o (没有打印测试过,但是我猜应该是这样)

其他的部分都是一些基础的makefile文件内容

需要注意的是,编译的时候需要加上 -I 头文件包含路径,-L 静态库路径 以及 动态库库名

静态库需要在生成 .o 的过程中加上,动态库只需要在生成可执行程序的过程添加。(暂时存疑,应该是静态库在生成可执行文件的过程添加,动态库只需要 -Wl,-rpath= 指定路径和库名即可,在程序动态运行的时候会自动去寻找)

注意:

变量后面不要加上空格

原文地址:https://www.cnblogs.com/wanghao-boke/p/13647173.html