文件结构如下:
其中,前两个.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= 指定路径和库名即可,在程序动态运行的时候会自动去寻找)
注意:
变量后面不要加上空格