编写简单通用makefile
来源:互联网 发布:宝钢武钢合并。知乎 编辑:程序博客网 时间:2024/05/20 02:22
在Makefile基础中总结了makefile最常用的基础,利用这些知识点,足矣编写通用makefile运用于c/c++项目中。本文基于这样的文件编写makefile:
编写makefile需要实现:
(1) 将bank.cpp编译成静态库bank.a/动态库bank.so;
(2) 将bank.a和bank.so拷贝/opt/lib目录下;
(3) 将bank.h拷贝到/optinclude目录下;
(4) 将测试程序文件test.c编译成test
makefile文件内容如下:
MAKE = make -s #指定make的方式CC = gcc #指定编译工具AR = ar -rcv #指定.o文件打包工具,编译静态库用RM = /bin/rm -f #指定删除命令CP = /bin/cp -f #指定拷贝命令LIBS_INSTALL_DIR = /opt/ #指定目标文件的最终拷贝的目的目录INCLUDE_LIBS = bank1.h #指定编译时依赖的头文件CPPFLAGS := -I. -fPIC #指定头文件所在目录LDFLAGS = -lpthread #链接用的库及所在目录SO ?= libbank.so #指定生成的目标文件,动态库A ?= libbank.a #指定生成的目标文件,静态库TEST ?= test #指定生成的目标文件,测试程序LIBS = bank1.o #生成的中间文件.PHONY: SO A TEST #声明SO A TEST为伪规则,这样即使目标文件存在的情况下也是会执行对应的生成规则all : clean $(SO) $(A) $(TEST) #all是整个makefile的入口,它依赖于SO A TEST$(TEST) : #编译测试程序test.c文件 $(CC) %(LIBS) test.c -o $@ $(CPPLIAGS) $(LDFLAGS)$(SO) : $(LIBS) #编译生成动态库 $(CC) -shared -$^ -O $@ $(A) : $(LIBS) #编译生成静态库 $(AR) $@ $(LIBS)%.o : %.c #将对应的.c文件编译成.o文件 $(CC) -c $< -o $@ $(CPPFLAGS)clean: #清除 @$(RM) $(SO) $(A) $(TEST) $(LIBS)install : all #安装,其实就是将目标文件拷贝到目的目录 @$(CP) $(SO) $(A) $(LIBS_INSTALL_DIR)/lib @$(CP) $(INCLUDE_LIBS) $(LIBS_INSTALL_DIR)/includeuninstall: #卸载,其实就是将目标文件从目的目录中删除 @$(RM) $(LIBS_INSTALL_DIR)/lib/$(SO) $(LIBS_INSTALL_DIR)/lib/$(A) $(LIBS_INSTALL_DIR)/include/$(INCLUDE_LIBS)
这是将一个目录下的文件编译成库文件的makefile,倘若有多个这样的目录都要生成库文件,其目录下makefile几乎是一样的,不一样的只是makefile文件中开头定义的那些变量,所以可以将这些一样的代码抽取出来放在一个config.mk文件(config.mk也是一样makefile文件)中放在顶层目录,然后在不同的目录下的makefile中写每个目录独有的部分,最后包含(include)config.mk文件,这样就可以实现多目录项目的通用makefile了,用到的也是Makefile基础讲到的知识。
阅读全文
0 0
- 编写简单通用makefile
- 编写一个简单通用的makefile
- Makefile通用编写规则
- 编写通用Makefile
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 一个通用Makefile的编写
- 编写简单Makefile (一)
- 动态顺序表的增、删、查、找
- MySQL主主复制+keepalived打造高可用MySQL集群
- STL学习笔记
- ORACLE RAC体系结构图
- AutoCAD .Net 设置UCS与直线对齐
- 编写简单通用makefile
- MySQL数据库使用——MySQL数据库管理
- bzoj4519[Cqoi2016]不同的最小割
- bootstrap selectpicker 动态增加选项
- Java并发编程的艺术(十)——线程池(1)
- Linux 进程--父进程查询子进程的退出状态
- 考题篇(5.4) NSE4 05. 防火墙验证 ❀ 飞塔 (Fortinet) 网络安全专家
- 知道答案在哪里比知道答案更重要
- 处理输入成绩异常