在Linux开发中,Makefile占有比较重要的一席之地。几乎所有的开源项目都会带有Makefile——或脚本产生,或自带。前面的文章也有介绍过,linux环境编译程序有三个步骤:./configure、make和make install。在此过程,configure脚本就会产生Makefile。

另外有些项目是自带Makefile的,比如busybox和kernel。当然,现在也有很多项目为了跨平台编译而使用cmake,比如opencv。

在实际开发中,笔者比较喜欢使用自己编写的Makefile模板,包括应用层和驱动层。本文主要说说应用层的Makefile模板。这个模板的好处是在使用时,只需要修改编译器名称(比如交叉编译情况)、目标名称、头文件、库文件路径即可,其它无需修改。可适用于静态库、动态库、二进制程序的编译。

为了方便介绍,下面分段说说Makefile内容。如使用Makefile模板,请到文后github下载。另外要注意的是Makefile的规则后是使用Tab键的,不能使用空格。

1、编译器、链接器配置。如需交叉编译,则在这里指定交叉编译器。

# !!!=== cross compile...
CROSS_COMPILE ?= CC  = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++
AR  = $(CROSS_COMPILE)arARFLAGS = -cr
RM     = -rm -rf
MAKE   = make

2、这里指定目标文件,可以是静态库.a文件,动态库.so文件,其它则为二进制文件。后面会根据此目标名称做判断,执行相应的动作。

# !!!===
# target executable file or .a or .so
target = a.out

3、这里指定的是编译选项CFLAGS。默认开启所有警告,并且遇到第一个编译错误时就停止,不再继续编译。这样做的目的是方便大家排查编译错误。

# !!!===
# compile flags
CFLAGS += -Wall -Wfatal-errors

4、这里指定的是debug版本还是release版本,两者由不同的编译选项来确定。默认是debug版本。

#****************************************************************************
# 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

5、这里是额外的编译选项,包括头文件路径、库路径、宏定义等。

# !!!===
DEFS    += -DJIMKENTCFLAGS  += $(DEFS)
CXXFLAGS = $(CFLAGS)LIBS    += LDFLAGS += $(LIBS)# !!!===
INC1 = ./
INC2 = ./inc
INC3 =
INCDIRS := -I$(INC1) -I$(INC2)# !!!===
CFLAGS += $(INCDIRS)
CXXFLAGS += # !!!===
LDFLAGS += -lpthread -lrtDYNC_FLAGS += -fpic -shared

6、这里是源码目录名称。如果是工程源码与Makefile在同一级目录,则使用下面的即可(默认是“.”,表示当前目录)。

# !!!===
# 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 = 

7、这里是输出详细编译信息的开关,可以make V=1开启,默认关闭。在观察编译过程使用哪些路径或编译选项时,可以使用这个功能。

ifeq ($(V),1)
Q=
NQ=true
else
Q=@
NQ=echo
endif

8、这里是目标文件生成规则,根据不同目标,或使用g++,或使用ar。

$(target): $(OBJ)ifeq ($(suffix $(target)), .so)@$(NQ) "Generating dynamic lib file..." $(notdir $(target))$(Q)$(CXX) $(CXXFLAGS) $^ -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) $(CXXFLAGS) $^ -o $(target) $(LDFLAGS)
endif

9、这里是编译规则,根据.c和.cpp文件调用不同的命令进行编译。

# 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) $(CXXFLAGS) -c $< -o $@

10、这里是清除命令,主要是清除生成的临时文件和目标文件。值得一提的是下面的find语句,如果生成的.o文件体积十分大并且又不需要修改,则可以将其排除在删除之列。比如onvif开发的soapC.o文件,就不需要删除,这样就能加快编译速度了。

clean:@$(NQ) "Cleaning..."$(Q)$(RM) $(target)# use 'grep -v soapC.o' to skip the file@find . -iname '*.o' -o -iname '*.bak' -o -iname '*.d' | xargs rm -f

Makefile模板的git仓库地址:https://github.com/latelee/Makefile_templet

这个仓库作者会不定时更新。欢迎大家使用并提出宝贵意见。

李迟 2017.9.3 夜



嵌入式Linux入门10:编译管理Makefile相关推荐

  1. 嵌入式 Linux 入门(二、Linux 文件系统、文件类型及权限管理)

    嵌入式 Linux入 门第二课, linux 文件系统.文件类型及权限管理. ...... 矜辰所致 目录 前言 一.Linux 文件属性 1.1 Linux 文件类型 1.2 Linux 文件权限及 ...

  2. 嵌入式 Linux 入门(五、Shell 脚本编程上:认识 Shell 脚本)

    大家好,是矜辰所致,嵌入式 Linux入 门第五课,本课开始简单学习一下 Shell 脚本编程. 目录 前言 一.Shell 脚本基础说明 1.1 什么是 Shell 脚本 1.2 Shell 脚本的 ...

  3. 嵌入式 Linux 入门 环境篇(二、安装虚拟机 — 体验 Ubuntu 22.04)

    嵌入式 Linux入门 环境篇第二课,正好换了新电脑,更新 Ubuntu 虚拟机的安装, 体验一下 Ubuntu 22.04 ...... by 矜辰所致 前言 因为以前的电脑虚拟机环境我都配置好了, ...

  4. 嵌入式 Linux 入门(十、Linux 下的 C 编程)

    嵌入式 Linux 入门第十课,聊聊 linux 下的 C 编程...... 矜辰所致 插一句,问题讨论群在文末的推广,以后大家提问可以在群中,即便我不在也能看到历史记录. 目录 前言 一.C 语言编 ...

  5. 分享:嵌入式Linux入门学习指导

    很多嵌入式linux初学者对嵌入式linux学习十分迷茫,不知道该怎么一步步学习,嵌入式linux学习方法,学习的流程步骤以及学习过程中需要看哪些好的书籍.下面凌阳教育嵌入式培训网就为大家整理的嵌入式 ...

  6. 嵌入式Linux入门13:应用层调试

    本文主要介绍应用程序的调试方法. 很多网友问我怎么调试内核,怎么查找代码bug.其实我的方法不多.一是靠经验,掉入的坑多了,做笔记回顾,自然就有了经验.二是靠printf/printk大法跟踪.三是利 ...

  7. 嵌入式linux入门学习规划

    嵌入式linux入门学习规划 如何理解嵌入式系统 ◆嵌入式系统是面向用户.面向产品.面向应用的,它必须与具体应用相结合才会具有生命力.才更具有优势.因此可以这样理解上述三个面向的含义,即嵌入式系统是与 ...

  8. 嵌入式linux怎么入门,嵌入式linux入门六步走

    学习嵌入式linux怎样才能快速入门?这是很多出来华清远见参加嵌入式培训学员爱问的问题,这里做一个总结供大家参考,嵌入式linux入门可以概括为六步走: 第一步:学习基本的裸机编程 对于学硬件的人而言 ...

  9. 嵌入式linux入门3-3-套接字

    个人博客对应地址:嵌入式linux入门3-3-套接字 socket主要函数 创建套接字 socket,我们一般翻译为套接字,其是一种通讯接口,允许位于不同计算机之间的线程通过网络进行通讯,我们可以使用 ...

最新文章

  1. tar.xz、tar.bz2 压缩包解压方式
  2. centos+ffmpeg安装配置+切片
  3. vue-resource跨域问题
  4. linux pdf to txt,PDF转换为TXT
  5. 史上最全的开发和设计资源大全
  6. [Android]Cygwin使用及NDK编译方法
  7. Paint方法总结(三):图层混合模式
  8. 面向对象程序设计方法学
  9. python科学计算库-Scipy,主要讲解优化,方程求解,积分,蒙特卡洛,插值计算
  10. ZoomIt 演示辅助软件 屏幕放大镜
  11. 常见的 Android 性能指标获取方式:CPU、FPS、Memory、GPU 、I/O、Network
  12. Zabbix Database error
  13. 重磅!中国首家互联网银行联手腾讯、华为各大APP,最高5万额度,疯狂提额100亿!!!...
  14. OSPF ASBR及4类LSA研究
  15. 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术
  16. 分布式学习(3)etcd@2@HTTP API v2
  17. android – 多屏幕适配相关
  18. 浅谈来自德国的电子分类系统eCl@ss
  19. 长调用与短调用 调用门
  20. db2diag的一些学习

热门文章

  1. html按钮样式_一组强大的CSS3 Material 按钮
  2. 蔚来ET5将于2022年9月开启交付 补贴前售价32.8万元起
  3. 还香吗?iPhone 13/Pro 手机“失灵”:不支持通过 Apple Watch 解锁屏幕
  4. 三星Galaxy S21 FE即将量产:8月登场 小屏满血旗舰!
  5. 九阳股份:公司部分产品已开始对接使用华为鸿蒙系统
  6. 中兴通讯、江苏联通联合成立5G消息开放实验室
  7. 网友调侃特斯拉股价要冲向火星 马斯克:疯狂的时代
  8. 化繁为简 回归初心 细品雅致设计的vivo X50系列
  9. iPhone最让人头疼的问题有望解决了,2020年将使用高通基带
  10. 除了速度与激情 领克01带给我另一种有关生活方式的想象