<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97%E4%B8%ADMakefile%E7%9A%84%E8%87%AA%E6%88%91%E7%90%86%E8%A7%A3</id>
	<title>驱动模块中Makefile的自我理解 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.mywiki.cn/Hovercool/index.php?action=history&amp;feed=atom&amp;title=%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97%E4%B8%ADMakefile%E7%9A%84%E8%87%AA%E6%88%91%E7%90%86%E8%A7%A3"/>
	<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97%E4%B8%ADMakefile%E7%9A%84%E8%87%AA%E6%88%91%E7%90%86%E8%A7%A3&amp;action=history"/>
	<updated>2026-09-01T05:44:59Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.mywiki.cn/Hovercool/index.php?title=%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97%E4%B8%ADMakefile%E7%9A%84%E8%87%AA%E6%88%91%E7%90%86%E8%A7%A3&amp;diff=786&amp;oldid=prev</id>
		<title>2015年5月6日 (三) 08:14 Hovercool</title>
		<link rel="alternate" type="text/html" href="https://www.mywiki.cn/Hovercool/index.php?title=%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97%E4%B8%ADMakefile%E7%9A%84%E8%87%AA%E6%88%91%E7%90%86%E8%A7%A3&amp;diff=786&amp;oldid=prev"/>
		<updated>2015-05-06T08:14:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;对于一个简单的驱动模块，以下为Makefile的经典构成：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;prettyprint&amp;quot;&amp;gt;&lt;br /&gt;
 //------------Makefile----------------------&lt;br /&gt;
 obj-m := hello.o&lt;br /&gt;
 KERNELDIR := /lib/modules/$(shell uname -r)/build&lt;br /&gt;
 PWD := $(shell pwd)&lt;br /&gt;
 modules:&lt;br /&gt;
     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules #注意前面必须为tab&lt;br /&gt;
 modules_install:&lt;br /&gt;
     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install #注意前面必须为tab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
下面逐一分析一下各个语句：&lt;br /&gt;
&lt;br /&gt;
*obj-m := hello.o&lt;br /&gt;
&lt;br /&gt;
:这句意为有一个模块需要从目标文件hello.o中构造，构造的模块名称为hello.ko.&lt;br /&gt;
&lt;br /&gt;
*KERNELDIR := /lib/modules/$(shell uname -r)/build&lt;br /&gt;
&lt;br /&gt;
:这里是定义一个变量KERNELDIR，并且赋值为&amp;quot;/lib/modules/$(shell uname -r)/build&amp;quot;。&lt;br /&gt;
&lt;br /&gt;
:这个值中要解释的只有一点，即$(shell uname -r)：&lt;br /&gt;
&lt;br /&gt;
::大家可以尝试在terminal中输入 $:uname -r是什么结果，没错，这个命令会获取当前内核的版本号，如“2.6.38.2”。&lt;br /&gt;
&lt;br /&gt;
::然后我们再查看&amp;quot;/lib/modules&amp;quot;目录下有哪些文件：&lt;br /&gt;
&lt;br /&gt;
 $:ls /lib/modules/&lt;br /&gt;
&lt;br /&gt;
::结果为：&lt;br /&gt;
&lt;br /&gt;
 2.6.38.2  2.6.38-8-generic&lt;br /&gt;
&lt;br /&gt;
:所以&amp;quot;/lib/modules/$(shell uname -r)/build&amp;quot;的意思已经很明确了，就是当前内核的源代码目录&lt;br /&gt;
&lt;br /&gt;
*PWD := $(shell pwd)&lt;br /&gt;
&lt;br /&gt;
:有了KERNELDIR的解释，相信这个也不多说了，就是获取当前目录了。总之在shell里，$(shell xxx)就是相当于在terminal中执行 xxx命令。&lt;br /&gt;
&lt;br /&gt;
*$(MAKE) -C $(KERNELDIR) M=$(PWD) modules&lt;br /&gt;
&lt;br /&gt;
:这就是编译模块了：首先改变目录到-C选项指定的位置（即内核源代码目录），其中保存有内核的顶层makefile；M=选项让该makefile在构造modules目标之前返回到模块源代码目录；然后，modueles目标指向obj-m变量中设定的模块；在上面的例子中，我们将该变量设置成了hello.o。（---引自ldd3 P29）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ps&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
在ldd3 P29页，讲到Makefile时，有一个这样的示例：&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 //Makefile很简单&lt;br /&gt;
 obj-m := hello.o&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
但编译模块时，则使用以下命令：&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $:make -C ~/kernel-2.6 M=&amp;#039;pwd&amp;#039; modules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
其中&amp;quot;~/kernel-2.6&amp;quot;为内核源代码树目录，要视自己放置位置而更改，故对应本机环境的命令是：&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $:make -C /usr/src/linux-source-2.6.38 M=&amp;#039;pwd&amp;#039; modules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
不过，在我现在的版本上这条命令会返回错误：&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 scripts/Makefile.build:44: /usr/src/linux-source-2.6.38/pwd/Makefile: 没有那个文件或目录&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
要更换为下面的命令（我是从[http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt kbuild说明文档]上得知的）：&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $:make -C /usr/src/linux-source-2.6.38 M=$PWD modules&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
最后效果和第一种方法完全一样！&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:#1d2efc;&amp;quot;&amp;gt;&lt;br /&gt;
现在，我们对比一下这两种方法可以知道，其实它们之间的唯一区别就是源码目录不一样，分别为&amp;quot;/lib/modules/$(shell uname -r)/build&amp;quot;和&amp;quot;/usr/src/linux-source-2.6.38/&amp;quot;，但如果[[驱动开发环境搭建|编译过内核]]就会知道，usr目录下那个源代码一般是我们自己下载后解压的，而lib目录下的则是在编译时自动copy过去的，两者的文件结构完全一样，故make效果完全一致就不足为怪了。&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hovercool</name></author>
	</entry>
</feed>