首页 > 其他分享 >makefile文件案例

makefile文件案例

时间:2024-08-27 16:50:09浏览次数:9  
标签:文件 gcc led makefile 案例 objects linux main DIR

#////////////////////////////////
Makefile五大特性:显式规则、隐晦规则、变量定义$、文件指示和注释(#)
#Tab键开始


#//////////////////////////////////
#标准写法

objects = main.o led.o uart.o /
gpio.o spi.o

edit : $(objects)
gcc -o edit $(objects)
main.o : main.c includes.h
gcc -c main.c
led.o : led.c led.h includes.h
gcc -c led.c
uart.o : uart.c uart.h includes.h
gcc -c uart.c
gpio.o : gpio.c gpio.h includes.h
gcc -c gpio.c
spi.o : spi.c spi.h includes.h
gcc -c spi.c
clean :
rm edit $(objects)

 

#////////////////////////////
#自动依赖文件写法(如找到led.o文件,那么led.c就会变为依赖文件,同时会推导出 gcc -c led.c)

objects = main.o led.o uart.o \
gpio.o spi.o

edit : $(objects)
gcc -o edit $(objects)
main.o : includes.h
led.o : led.h includes.h
uart.o : uart.h includes.h
gpio.o : gpio.h includes.h
spi.o : spi.h includes.h

#伪目标文件
.PHONY : clean

clean :
rm edit $(objects)

 

#///////////////////////////
#最新另类写法

objects = main.o led.o uart.o \
gpio.o spi.o

edit : $(objects)
gcc -o edit $(objects)
$(objects) : includes.h
led.o : led.h
uart.o : uart.h
gpio.o : gpio.h
spi.o : spi.h

#伪目标文件
.PHONY : clean

clean :
-rm edit $(objects)

 

#////////////////////////

#更简洁写法

#wildcard : 扩展通配符
#notdir : 去除路径
#patsubst :替换通配符
src = $(wildcard *.c ./bsp/*.c) # wildcard把 指定目录 ./ 和 ./bsp/ 下的所有后缀是c的文件全部展开;得到main.c ./bps/led.c
file = $(notdir $(src)) #notdir把展开的文件去除掉路径信息; 得到main.c led.c
obj = $(patsubst%.c,%.o,$(src)) #patsubst把$(file)中的变量符合后缀是.c的全部替换成.o;得到main.o led.o
#编译并链接所有.c和.o文件
objects = $(patsubst %.c, %.o, $(wildcard *.c))
main : $(objects)
gcc -o main $(objects)

#文件搜索
#"src"和“../headers”两个路径顺序搜索,:进行分隔。
VPATH = src : ../headers
#要求make在“../headers”目录下搜索所有以 .h 结尾的文件
vpath %.h ../headers

#伪目标
.PHONY : clean
clean
rm -f *.o #删除所有.o文件

all :prog1 prog2 prog3
.PHONY : all

#自动生成依赖

 

#/////////////////////////////

1、编译驱动一般将驱动编译成模块(.ko文件),然后加载到内核,这用到make modules命令

//=======================================================//
2、单个.c文件编译成一个.ko文件

#linux内核源码目录
KERNEL_DIR := /home/alientek/workspace/im6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
#当前路径
CURRENT_DIR := $(shell pwd)
#obj-m 编译为独立的驱动模块
obj-m := led.o

build : kernel_modules
kernel_modules:
$(MAKE) -C(KERNEL_DIR) M=$(CURRENT_DIR) modules

.PHONY:clean
clean:
$(MAKE) -C((KERNEL_DIR) ) M=$(CURRENT_DIR) clean

//========================================================//
3、多个文件编译成一个.ko文件

假设我们要将 add.c、sub.c 编译成一个ko文件,只有 add.c 包含了模块初始化函数(module_init),sub.c 只是add.c 的依赖源文件。大体和上面单文件单模块类似,不同之处如下:
obj-m += 模块名.o
模块名-objs += 源文件名.o ...

#linux内核源码目录
KERNEL_DIR := /home/alientek/workspace/im6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
#当前路径
CURRENT_DIR := $(shell pwd)
#obj-m += 模块名.o
obj-m += led.o
#模块名-objs += 源文件名.o ...
led-obj += add.o sub.o

build : kernel_modules
kernel_modules:
$(MAKE) -C(KERNEL_DIR) M=$(CURRENT_DIR) modules

.PHONY:clean
clean:
$(MAKE) -C((KERNEL_DIR) ) M=$(CURRENT_DIR) clean

//===================================================//
4、多个模块编译

#linux内核源码目录
KERNEL_DIR := /home/alientek/workspace/im6ull-kernel/linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek
#当前路径
CURRENT_DIR := $(shell pwd)
#obj-m += 模块名1.o 模块名2.o
obj-m += led.o uart.o usb.o

build : kernel_modules
kernel_modules:
$(MAKE) -C(KERNEL_DIR) M=$(CURRENT_DIR) modules

.PHONY:clean
clean:
$(MAKE) -C((KERNEL_DIR) ) M=$(CURRENT_DIR) clean

//===================================================//

#RK3566的gpio-led内核级应用程序的makefile 

PWD ?= $(shell pwd)

KERNELDIR := /home/zbl/tspi-rk3566/sdk/linux/kernel
CROSS_COMPILE ?= /home/zbl/tspi-rk3566/sdk/linux/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
CC := $(CROSS_COMPILE)gcc

 

obj-m += gpioled.o

module:
make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 modules
@# -C 表示从当前目录切换到内核源码目录下,借助内核源码makefile进行make编译
@# M=$(PWD) 表示只编译当前目录下的驱动
@# ARCH=arm64 指定编译架构

$(CC) gpioledapp.c -o app
@# 交叉编译应用程序

.PHONE:clean

clean:
make -C $(KERNELDIR) M=$(PWD) ARCH=arm64 clean
rm app

 

标签:文件,gcc,led,makefile,案例,objects,linux,main,DIR
From: https://www.cnblogs.com/zblblog/p/18382980

相关文章

  • uniapp 在线预览pdf 或者 文件
    页面代码:<template><view><web-view:src="fileUrl"></web-view></view></template><script>exportdefault{data(){return{fileUrl:"&quo......
  • makefile基础知识
    makefile知识 1、 Makefile五大内容(显示规则、隐晦规则、变量定义、文件指示、注释)1.1、显示规则:如何生成一个或多个目标文件(要生成的文件,文件依赖的文件,生成命令);stm32:main.ohello.ogcc-ostm32main.ohello.o1.2、隐晦规则:Makefile的自动推导功能,所以隐晦规则可......
  • vue ant-design上传文件,暂存后在其他页面提交数据(file格式转base64后保存数据,其他页面
    longlongtimenoupdate,huuuuu~最近做一个看起来简单但是功能有点繁琐的东西就是再A页面上传文件,然后B页面确定上传后调用接口,我不知道我这个逻辑对不对哈,有毛病求指教首先用的ant-design框架上传文件<a-uploadlist-type="text":multiple="false":file-list="fileList"......
  • 行业级API集成案例,巩固你的知识
    在当今高度互联的世界,企业依靠无缝数据交换和简化的工作流程蓬勃发展。API(应用程序编程接口)已成为实现这一目标的秘密武器,可实现各种应用程序之间的强大集成。本文深入探讨了不同行业中 API 集成的真实示例,让您更深入地了解它们的技术方面以及它们带来的切实业务效益。API集......
  • 提取文章里文件链接
    defget_content_and_images(page_tree,div_name,div_classes):content=''img_href_list=[]fordiv_classindiv_classes:#获取内容和图片/视频链接new_content=''.join(page_tree.xpath(f'//{div_name}[contains(......
  • PC触摸屏之设备维护【选项】往HMI装载字体文件
    组态好的项目下载到精智(Comfort)屏,画面上的中文显示乱码等异常现象。出现这个现象请检查画面对象的文本是否使用的宋体,建议大家使用宋体,这个字体是经过西门子技术部门测试过的。另外还可以把中文字体下载到屏上。选中屏的型号,点击鼠标右键,选择设备维护>选项。 后面选择接......
  • 【编程规范具体案例(基于Qt、微软、谷歌和AUTOSAR C++14 参考)】 C++ 编码规范 之并发篇
    目录标题并发目录12.并发编程规范12.1线程创建与管理规则12.1.1\[必须]明确定义线程的生命周期管理策略12.1.2\[必须]为关键线程设置明确的标识符12.1.3\[必须]在多线程环境中安全地处理异常12.2线程同步规则12.2.1\[必须]使用线程安......
  • 基于nodejs的本地文件增删改查的工具代码
    一、代码封装这是一个使用node.js实现的对本地文件进行增删改查的工具代码封装,其中代码结尾包含了使用方法示例,具体封装代码如下://jsonTool.jsconstfs=require('fs');constpath=require('path');//定义JSON文件的路径constfilePath=path.join(__dirname,'........
  • ptrade排坑日记——研究界面上传csv文件后,无法查看!
    前言今天想要和大家分享的一个问题是csv文件上传以后,没有办法查看,希望后续使用ptrade的过程中遇见相似问题可以快速解决!一、问题描述客户反馈,在量化研究界面上传了使用wps保存的一个csv文件后,但是在研究界面是没有办法查看的!如果是使用微软把excel转为csv后就可以查看,就是wp......
  • 数据库系统 第26节 数据库调优 案例分析
    数据库调优通常不需要修改源代码,因为它主要涉及数据库配置、查询优化和硬件调整等方面。然而,源代码中的某些实践可以显著影响数据库性能。以下是一些常见的源代码实践,这些实践可以与数据库调优相结合:参数化查询:避免SQL注入并提高查询效率,使用参数化查询代替字符串拼接查......