最全的交叉编译Makefile讲解

最近正在搞交叉编译,参考很多博客,学习了一下Makefile的编写,记录一下Makefile内代码是什么意思。

代码如下:(简单的hello.ko的makefile)

ifneq ($(KERNELRELEASE),)
obj-m += hello.o 
else
PWD := $(shell pwd)
KDIR := /home/xuejunjie/raspberry_src/linux-rpi-5.4.y

all:
	make  -C  $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 
clean:
	rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers
endif

ifneq ($(KERNELRELEASE),)
KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容
如果make的目标是clean,直接执行clean操作,然后结束。
当make的目标为all时,-C (KDIR)指明跳转到内核源码目录下读取那里的Makefile;
M=(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。
当从内核源码目录返回时,KERNELRELEASE已被定义,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。

obj-m := hello.o表示编译连接后将生成param.o模块。
P.S.
obj-m = *.o
obj-y = *.o
上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。
参考:https://blog.csdn.net/xiaocaichonga/article/details/7788778
http://blog.chinaunix.net/uid-31426707-id-5757993.html

PWD := $(shell pwd)
makefile中,要调用shell脚本。需要特殊的语法。比如要调用xxx命令。相应的语法是(shell xxx)
pwd命令是获取当前文件夹所在路径。

modules
编译成模块

make -C (KDIR) M=(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
-C (KDIR):指明跳转到内核源码目录下读取那里的Makefile;
M=(PWD) :表明然后返回到当前目录继续读入、执行当前的Makefile。
ARCH=arm:make ARCH=arm就是编译arch/arm下的代码。
P.S.
ARCH即architecture,就是选择编译哪一种cpu architecture,也就是编译arch/目录下的哪一个子目录。如指定make ARCH=arm就是编译arch/arm下的代码。如果不指定,make将使用本机(用什么机器编译就是什么)的cpu作为缺省ARCH.注意:arch/arm下不但有arm体系架构特有的代码,还有arm特有的kconfig,也就是配置选项,所以在make menuconfig,make xxxx_defconfig的时候也必须指定ARCH=arm。

CROSS_COMPILE=arm-linux-gnueabihf-:make CROSS_COMPILE=arm-linux-gnueabihf-就是使用arm-linux-gnueabihf-gcc工具将代码编译成arm的可执行指令。
P.S.
CROSS_COMPILE即交叉编译器的前缀(prefix),也就是选择将代码编译成目标cpu的指令的工具,如果不指定CROSS_COMPILE参数,make时将认为prefix为空,即使用gcc来编译。这里cross_compile的设置,是假定所用的交叉工具链的gcc程序名称为arm-linux-gcc。如果实际使用的gcc名称是some-thing-else-gcc,则这里照葫芦画瓢填some-thing-else-即可。总之,要省去名称中最后的gcc那3个字母。
在配置或编译内核之前,首先要确定目标CPU架构,以及编译时采用什么工具链。这是最最基础的信息,首先要确定的。
参考:https://blog.csdn.net/zydlyq/article/details/50997582

编译过程:先进入Linux内核所在的目录,并编译出hello.o文件,运行MODPOST会生成临时的hello.mod.c文件,而后根据此文件编译出hello.mod.o,之后连接hello.o和hello.mod.o文件得到模块目标文件hello.ko,最后离开Linux内核所在的目录。
参考:https://blog.csdn.net/njuitjf/article/details/40348491

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Makefile是一种常用的自动化构建工具,用于编译和链接程序。交叉编译是指在一台计算机上编译生成可以在另一种计算机上运行的程序。下面介绍如何使用Makefile进行交叉编译。 1. 确定目标平台和交叉编译工具链 首先需要确定目标平台和交叉编译工具链。目标平台包括处理器架构和操作系统,例如ARM处理器和Linux操作系统。交叉编译工具链是指用于编译和链接程序的工具集,包括编译器、链接器、库文件等。可以从官方网站或第三方网站下载对应的交叉编译工具链。 2. 修改Makefile文件 在Makefile文件中需要添加一些变量和规则,以便使用交叉编译工具链进行编译和链接。下面是一个示例Makefile文件: ``` # 指定交叉编译工具链 CROSS_COMPILE = arm-linux-gnueabihf- # 指定编译器和链接器 CC = $(CROSS_COMPILE)gcc LD = $(CROSS_COMPILE)ld # 指定编译选项和链接选项 CFLAGS = -Wall -Iinclude LDFLAGS = -Llib -lmylib # 指定目标文件和依赖文件 TARGET = myprogram OBJS = main.o foo.o bar.o DEPS = include/foo.h include/bar.h # 编译规则 $(TARGET): $(OBJS) $(LD) $(LDFLAGS) $^ -o $@ %.o: %.c $(DEPS) $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(TARGET) $(OBJS) ``` 在这个示例Makefile文件中,使用了CROSS_COMPILE变量指定了交叉编译工具链的前缀,例如arm-linux-gnueabihf-,使得编译器和链接器使用交叉编译工具链。同时指定了编译选项和链接选项,以及目标文件和依赖文件。最后定义了编译规则和清理规则。 3. 执行Make命令进行交叉编译 在命令行中执行make命令,即可使用Makefile进行交叉编译。例如: ``` $ make ``` 如果一切顺利,就会生成可在目标平台上运行的程序。 总之,使用Makefile进行交叉编译需要确定目标平台和交叉编译工具链,修改Makefile文件,以及执行make命令进行编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值