linux开发之Makefile

第一部分 通用Makefile

#指定交叉编译工具链
CROSS_COMPILE = arm-linux-

AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump

# export导出的变量是给子目录下的Makefile使用的
export AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP

# 编译器在编译时的参数设置
CFLAGS := -Wall -O2 -g -DDEBUG
# 添加头文件路径,不添加的话include目录下的头文件编译时找不到
CFLAGS += -I $(shell pwd)/include -I/opt/libdecode/include

# 链接器的链接参数设置,链接库
LDFLAGS := -ljpeg -lz -lpng -L/opt/libdecode/lib

export CFLAGS LDFLAGS

TOPDIR := $(shell pwd)
export TOPDIR

# 定义将来编译生成的可执行程序的名字
TARGET := video2lcd

# 添加项目中所有用到的源文件,有顶层目录下的.c文件,和子文件夹
# 添加顶层目录下的.c文件
obj-y += main.o

# 添加顶层目录下的子文件夹(注意目录名后面加一个/)
obj-y += main.o
obj-y += convert/

all:
make -C ./ -f $(TOPDIR)/Makefile.build
$(CC) $(LDFLAGS) -o $(TARGET) built-in.o

cp:
cp ../testproject/ /root/rootfs/ -rf

clean:
rm -f $(shell find -name "*.o")
rm -f $(TARGET)

distclean:
rm -f $(shell find -name "*.o")
rm -f $(TARGET)

第二部分 Makefile基本语法

make命令根据文件更新的时间戳来决定哪些文件需要重新编译,这使得可以避免编译已经编译过的程序,提高编译效率。

1、Makefile规则
目标(target)...: yon依赖(prerequiries)...
<tab>命令(command)

目标:通常是要生成的文件的名称,可以是可执行文件,也可以是一个执行的动作名称。
依赖:用来产生目标的原材料(比如源文件),一个目标经常有几个依赖。
命令:生成目标时执行的动作(每个规则可以有可以含有几个命令)

2、Makefile常用函数,
函数调用格式为 $(function arguments)
解析:这里"function"是函数名,"arguments"是该函数的参数。参数和函数名之间用空格和Tab隔开,如果有多个参数,它们之间用逗号隔开。

(1)字符串替换和分析函数 $(subst from,to,text)
说明:在文本"text"中使用"to"替换每一处"from"。
eg: $(subst ee,EE,feet on the street) 结果为 "fEET on the strEEt"
(2)$(patsubst pattern,replacement,text)
说明:寻找"text"中符合格式"pattern"的字,用"replacement"替换它们。"pattern"和"replacement"中可以使用通配符。
eg: $(patsubst %.c,%.o,x.c.c bar.c) 结果 "x.c.o bar.o"
(3)$(strip string)
说明:去掉前导和结尾空格,并将中间的多个空格压缩为单个空格。
eg: $(strip a b c) 结果 "abc"

3、Makefile中的特殊字符
(1)"[email protected]" 表示规则的目标文件名;
(2)"$^" 表示所有依赖的名字,名字之间用空格隔开;
(3)"$<" 表示第一个以来的文件名

原文地址:https://www.cnblogs.com/gzqblogs/p/10202429.html

时间: 2024-12-08 08:35:33

linux开发之Makefile的相关文章

Oracle Proc开发之Makefile的编写模板

Oracle的数据库开发中需要用到Proc,Proc就是嵌入式C 本文主要介绍的是Oracle数据库开发,Linux下Proc的Makefile示例: 1 .SUFFIXES: .c .o 2 3 CC=gcc 4 PROC=proc 5 6 PROCSRCS=oracle.pc 7 SRCS=$(PROCSRCS:.pc=.c) 8 OBJS=$(SRCS:.c=.o) 9 10 ORACLE_HOME=/opt/oracle/product/11.2.0 11 ORAFLAGS1=/usr/

Linux开发之Nginx安装配置

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器.在高连接并发的情况下,Nginx是Apache服务器不错的替代品. Nginx安装 系统平台:CentOSrelease6.6(Final)64位. 一.安装编译工具及库文件 yum-yinstallmakezlibzlib-develgcc-c++libtoolopensslopenssl-devel 二.

linux开发之shell编程

1.第一个shell程序 #!/bin/bash echo "What is your name?" read PERSON echo "Hello, $PERSON" 备注:(1)"#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell.echo命令用于向窗口输出文本:     (2)echo 是一个输出命令,可以用来输出数字.变量.字符串等:     (3)read read 命令从 stdin 获取输入并赋

ARM linux开发之Ubuntu上串口终端

一.简介 为了避免在ARM开发中频繁的切换ubuntu和windows系统,所以就想到,直接能控制开发板就好了. 1.ubuntu版本:18.04 2.USB转串口芯片:PL2303 3.虚拟机:VMware 14 4.ARM开发板系统:linux 二.连接串口到虚拟机 如图所示,将串口连接到虚拟机 三.ubuntu上安装minicom [email protected]:~$ sudo apt-get install minicom 四.配置Ubuntu上刚安装的minicom 1.查看串口终

linux驱动开发之HelloWorld

最近实习,公司项目搞的是平板开发,而我分配的任务是将驱动加载到内核中. 准备工作,必要知识了解:加载有两种方式,一种是动态加载和卸载即模块加载,另一种是直接编译进入内核:Linux内核把驱动程序划分为3种类型:字符设备.块设备和网络设备.字符设备和块设备可以像文件一样被访问.它们的主要区别不在于能否seek,而是 在于系统对于这两种类型设备的管理方式.应用程序对于字符设备的每一个I/O操作,都会直接传递给系统内核对应的驱动程序:而应用程序对于块设备的操作, 要经过系统的缓冲区管理,间接传递给驱动

Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. http://blog.csdn.net/kangear/article/details/40072707 在调试一下红外遥控器input驱动时,直接採用的是一个半成品的驱动在上边实现的自己的设备的匹配,但同一时候遇到了一些关于input输入子系统的疑惑. 按键一般有「按下和抬起」两个状态一般使用0和1

Android底层开发之Linux输入子系统要不要判断系统休眠状态上报键值

Android底层开发之Linux输入子系统要不要判断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是无用的,甚至是错误的.重点在最后,前边仅仅是一些假想推测. http://blog.csdn.net/kangear/article/details/40072707 在调试一下红外遥控器input驱动时,直接采用的是一个半成品的驱动在上边实现的自己的设备的匹配,但同时遇到了一些关于input输入子系统的疑惑. 按键一般有「按下和抬起」两个状态一般使用0和1来分

C连接MySQL数据库开发之Linux环境完整示例演示(增、删、改、查)

一.开发环境 ReadHat6.3 32位.mysql5.6.15.gcc4.4.6 二.编译 gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient main.c -o main.out -I:指定mysql头文件所在目录(默认去/usr/include目录下寻找所用到的头文件) -L:指定mysql动态库文件所在目录(默认从/usr/lib目录查找) -l:链接libmysqlclient.so动态库 -o:生成的可执行文件名 三.完整示例 //

嵌入式Linux驱动开发之helloword心得

自从选择了物联网这个专业,智能XX的字样牵动着每一个学习这个专业的孩子. 大家兴致勃勃的来到了学校,结果一切想象和自己的设想并不一样.想象中的各种智能般梦幻的场景变成了真实的高数/电路/模电等等诸如此类!不知道这个世界什么时候变得如此的浮躁,当大家的一段时间的努力看不到结果的时候就往往会不太感兴趣,模电大家都没听懂,于是大家自我安慰tmd学这玩意到底干什么?本人当初也是这样,可是到了后来接触了单片机,接触了应用电路的设计才知道那些课程那个没用啊!当初还是too young,too simple呀