一个使用多年的Makefile模板
layout: post
title:
category : linux系统
tags : [Makefile]
许久以前,一直使用自己总结的Makefile模板,这个模板也是基于现有资料整理而成的。
内容
Makefile完全内容如下:
# !!!=== cross compile...
CROSS_COMPILE ?= CC = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++
AR = $(CROSS_COMPILE)arARFLAGS = -cr
RM = -rm -rf
MAKE = makeCFLAGS =
LDFLAGS =
DEFS =
LIBS =# !!!===
# target executable file or .a or .so
target = a.out# !!!===
# compile flags
CFLAGS += -Wall -Wfatal-errors#****************************************************************************
# debug can be set to y to include debugging info, or n otherwise
debug = y#****************************************************************************ifeq ($(debug), y)CFLAGS += -ggdb -rdynamic
elseCFLAGS += -O2 -s
endif# !!!===
DEFS += -DFUCKCFLAGS += $(DEFS)LIBS += LDFLAGS += $(LIBS)# !!!===
INC1 = ./
INC2 = ./inc
INC3 =
INCDIRS := -I$(INC1) -I$(INC2)# !!!===
CFLAGS += $(INCDIRS)# !!!===
LDFLAGS += -lpthread -lrtDYNC_FLAGS += -fpic -shared# !!!===
# source file(s), including c file(s) or cpp file(s)
# you can also use $(wildcard *.c), etc.
SRC_DIR = .
SRC_DIR1 =
SRC_DIR2 =
SRC_DIR3 = # ok for c/c++
SRC = $(wildcard $(SRC_DIR)/*.c $(SRC_DIR)/*.cpp)
SRC+=$(wildcard $(SRC_DIR1)/*.c $(SRC_DIR1)/*.cpp)
SRC+=$(wildcard $(SRC_DIR2)/*.c $(SRC_DIR2)/*.cpp)
SRC+=$(wildcard $(SRC_DIR3)/*.c $(SRC_DIR3)/*.cpp)# ok for c/c++
OBJ = $(patsubst %.c,%.o, $(patsubst %.cpp,%.o, $(SRC))) # !!!===
# in case all .c/.cpp need g++...
# CC = $(CXX)ifeq ($(V),1)
Q=
NQ=true
else
Q=
NQ=echo
endif###############################################################################all: $(target)$(target): $(OBJ)ifeq ($(suffix $(target)), .so)@$(NQ) "Generating dynamic lib file..." $(notdir $(target))$(Q)$(CXX) $(CFLAGS) $^ -o $(target) $(LDFLAGS) $(DYNC_FLAGS)
else ifeq ($(suffix $(target)), .a)@$(NQ) "Generating static lib file..." $(notdir $(target))$(Q)$(AR) $(ARFLAGS) -o $(target) $^
else@$(NQ) "Generating executable file..." $(notdir $(target))$(Q)$(CXX) $(CFLAGS) $^ -o $(target) $(LDFLAGS)
endif# make all .c or .cpp
%.o: %.c@$(NQ) "Compiling: " $(addsuffix .c, $(basename $(notdir $@)))$(Q)$(CC) $(CFLAGS) -c $< -o $@%.o: %.cpp@$(NQ) "Compiling: " $(addsuffix .cpp, $(basename $(notdir $@)))$(Q)$(CXX) $(CFLAGS) -c $< -o $@clean:@$(NQ) "Cleaning..."$(Q)$(RM) $(target)@find . -iname '*.o' -o -iname '*.bak' -o -iname '*.d' | xargs rm -f.PHONY: all clean
使用
这个Makefile适用于一个目录或只有几个目录的情况,支持生成可执行程序、静态库、动态库。只需少许修改即可使用,如果是只有一个目录,无需任何修改,将其放到目录下,直接输入make即可编译生成a.out。所有要修改的地方均使用!!!===
来注明。
要注意,Makefile使用的是Tab键,如果不是的话,会提示错误,如:Makefile:81: *** missing separator. Stop.
。
小结
曾经想过构建一套完整的脚本系统,用于大型复杂的软件项目,但是,几经尝试,都不如意,就放弃了,选择从最简单的入手。然后根据实际项目,稍作修改即可应用。
李迟 2018.7.1
一个使用多年的Makefile模板相关推荐
- 复杂多目录的Makefile模板及示例
大约一年多以前,还在移植u-boot,当时参考了u-boot的Makefile,做了一个多目录的Makefile模板.如今,一年过去了,本篇文章还是折腾Makefile模板,本人的水平由此可见一斑.当 ...
- 复杂多目录的Makefile模板及示例-转
大约一年多以前,还在移植u-boot,当时参考了u-boot的Makefile,做了一个多目录的Makefile模板.如今,一年过去了,本篇文章还是折腾Makefile模板,本人的水平由此可见一斑.当 ...
- 一个适用各类场合的Makefile模板
1.写在前面 对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了"一键编译",编码完成后只需一个操作即可完成编译.链接.生成目标文件.Linu ...
- 一个STM32编译Makefile模板
最近突然对STM32感兴趣,研究了一下.STM32的编译方式非常多,由于一直对gcc情有独钟,所以还是喜欢使用Makefile+gcc编译的方法.当时从51单片机转向AVR单片机开发时,也是通过这种方 ...
- Makefile模板的继续改进
layout: post title: category : linux系统 tags : [Makefile] 上一文章的Makefile,存在一个比较大的问题,那就是生成可执行的二进制文件时,会链 ...
- GNU/Linux智能Makefile模板(多目录,多文件)
本文提供一个在GNU/Linux环境下通用的智能Makefile模板,用户可以将其引入到自己的工程当中.即使用户对此 Makefile的工作原理不甚了解,但是只需要修改少数几个关键变量,就可以满足不同 ...
- 万能 Makefile 模板
在 Linux 编程时,对于很多小工程来说,很多时候似乎没有必要用 autoconf 和 automake 工具来生成 Makefile,反而自己写一个 Makefile 更省事.这里给大家提供一个简 ...
- LINUX驱动Makefile模板
网上有好多关于驱动的Makefile怎么写,驱动程序怎么运行,为什么驱动会没有main等等问题的问题的问题.下面我也给出我的驱动Makefile模板,这些东东都是在书籍和人家的研究成果上改进而来的,至 ...
- 关于中型工程的Makefile模板
我们定义的中型工程 可能会有多层嵌套的源代码文件夹 一个源代码文件夹下可能有多个源代码子文件夹 中间文件应当在其源文件所在目录生成,而不是同一生成到一个目录下(如统一生成到obj目录下) (大多数情况 ...
最新文章
- 国家卫健委:我国男女性成人平均身高分别为169.7厘米和158厘米
- 自然语言处理在开放搜索中的应用
- 安卓系统手机软件_2M不到的安卓神器!有了这五款软件,iphone用户都羡慕
- Android之ActivityManager与Proxy模式的运用
- java向指定文件继续写内容_java 向指定文件写入内容(如文件存在,则先删除再创建;写入如目录不存在,则创建)...
- java拆装_JAVA线性表拆解
- [Golang]计算一个文件的MD5值
- mysql用创建的用户登陆并修改表格_MySQL 基础学习二:创建一个用户表,并增删改查...
- 子窗体中组合框联动_一张表实现组合框联动
- 程序开源与不开源区别_如何在公司中启动开源程序
- 重启服务器后网页显示nginx,解决重启服务器以后Nginx无法启动
- 三星emcp型号详解_三星emcp型号详解_eMCP终将成为过去式?解析:三星、美光所推出的uMCP为何物?......
- 市场调查有什么好的选题推荐么?
- [计算机网络]网络层
- R语言回归分析-改进异常值
- 当下非常火的VR全景展示到底是什么?
- 电池极耳尺寸视觉检测系统
- 如何做一个炫酷的动画网站-css实现图片上下浮动效果
- js 递归算法将扁平数据处理成树状数据
- stm32+drv8825驱动42步进电机
热门文章
- 铜陵高考2021年成绩查询,滁州高考成绩查询入口2021
- 学习web标准、用户体验改善、Ajaxamp;Asp.Net
- vivo X Fold或首发国产最强屏幕:120Hz LTPO 3.0
- 刷抖音18.5G、看视频22.5G,国美通报员工上班摸鱼:回应来了
- 《哈里波特:魔法觉醒》被指侮辱女性玩家?官方回应:动画BUG
- iPhone 12 mini大幅砍单 苹果可能又要因为屏幕而向三星支付违约金
- 上海新阳半导体收到ASML-1400光刻机 将用于研发193nm ArF光刻胶
- 苹果新隐私政策在iOS14.4测试版上线:能允许或拒绝“跟踪”
- 罗永浩回应被限制高消费:已跟债权方达成和解
- 一代人的记忆!又一波微信表情默默消失了