Linux makefile问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux makefile问题相关的知识,希望对你有一定的参考价值。

Freeradius开源代码中有如下一段makefile,主要是完成针对子目录的编译。但“@$(MAKE) $(MFLAGS) WHAT_TO_MAKE=$@ common”做如何解释,在编译文件里重新调用make命令,嵌套编译?也即这行命令作何解释。希望大侠帮我解释下,万分感谢!
SUBDIRS = $LIBLTDLPATH src raddb scripts doc
WHAT_TO_MAKE = all

all:
@$(MAKE) $(MFLAGS) WHAT_TO_MAKE=$@ common

common:
@for dir in $(SUBDIRS); do \
echo "Making $(WHAT_TO_MAKE) in $$dir..."; \
$(MAKE) $(MFLAGS) -C $$dir $(WHAT_TO_MAKE) || exit $$?; \
done

参考技术A 关注此问题

linux嵌入式驱动开发,makefile到问题

obj-m := helloworld.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD = $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(RM) *.o *.ko *.mod.c Module.symvers Module.markers Module.symvers module.order 问题1.obj-m := helloworld.o 有什么用 问题2:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules 这个没看懂特别是为什么有个=号,还有个modules? 问题3:$(RM) *.o *.ko *.mod.c Module.symvers Module.markers Module.symvers module.order 后面那么多东西干什么到啊!! 最重要到问题,我要完全看懂需要什么知识点。和我以前写到makefile不一样啊。

参考技术A 首先说一下,你要编译驱动程序,不再是跟原本编译应用程序那样可以在当前目录下直接make就好。
因为编译内核驱动的时候,是要用到内核文件里的头文件,还有内核提供的接口函数,要借助于内核文件夹里的makefile来编译你写好的驱动源代码,如果按一般的操作,你就得把源代码放到内核文件夹指定的目录下,然后再在那个目录下得makefile里添加一些语句,比如obj
-m什么的(把相应的驱动代码编译成模块),然后到内核文件夹的顶层目录make,生成相应的模块文件,就有你问题3的那一大堆东西,其中.ko就是要用到的。
把一些驱动编译成模块,和编译进内核的区别,你可以去了解下。。编译成模块用的是-m。
而为了方便你可以在任何目录下直接用make来编译驱动代码;就有以下这指令:
$(MAKE)
-C
$(KERNELDIR)
M=$(PWD)
modules
-C
指定的就是内核文件夹所在的地方
M=当前路径
modules的,是和make
联合起来的..make
modules命令,这个命令你可以去查查。
.ko文件就是用insmod命令插入到内核中,在去添加相应的设备文件,就可以在内核里跑起来了。

以上是关于Linux makefile问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在linux下写makefile

linux 中的makefile

linux内核模块编译makefile

linux 5如何安装makefile软件

如何提高linux makefile的编译速度

使用 Makefile.am/Makefile.in 在 Ubuntu Linux 中构建 c++ 项目