Linux makefile示例

时间:2013-10-07 11:27:01

标签: c linux makefile

您好我是linux的新手,我正在通过一个例子 http://www.linuxforu.com/2010/12/writing-your-first-linux-driver/ 我正在使用Ubuntu 12.04并创建了名为ofd.c的c代码文件(见下文),并保存在我在〜/ Development / MyProgs / myHelloWorldLinuxModule / v2中创建的目录中。我还创建了一个Makefile(见下文),它位于同一目录中 当我输入make时,我希望看到在同一目录中生成一个.ko文件,但我得到的是一条消息“默认情况下无法完成”

我真的不懂makefile

我应该在某处定义KERNELRELEASE,

默认情况下实际执行的行是什么,这是否意味着在内核目录和工作目录上执行make,或者我应该将代码放在特定的某处。

没有usr/src/linux but a /usr/src/linux-headers-3.8.0-29,所以我改变了这个,这是正确的。 (虽然似乎没有任何区别)。

非常感谢任何帮助。

代码:

/* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>

static int __init ofd_init(void) /* Constructor */
{
    printk(KERN_INFO "Namaskar: ofd registered");
    return 0;
}

static void __exit ofd_exit(void) /* Destructor */
{
    printk(KERN_INFO "Alvida: ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("Our First Driver");`

生成文件......

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /usr/src/linux
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif

4 个答案:

答案 0 :(得分:1)

错误归因于naming convention your makefile is not able to find source code 首先通过键入uname -a

来检查正在运行的内核

然后转到cd /usr/src/

然后检查你的linux源代码名称

例如

uname -a Linux vinay-VirtualBox 3.2.0-50-generic-pae #76-Ubuntu SMP Tue Jul 9 19:24:55 UTC 2013 i686 i686 i386 GNU/Linux

这里的源代码名称为linux-headers-3.2.0-50-generic-pae

所以在你的Makefile中你需要像这样给出正确的名字

KERNEL_SOURCE := /usr/src/linux-headers-3.2.0-50-generic-pae

要避免上述问题,请尝试使用此Makefile

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
  obj-m := ofd.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif

这里uname -a解决问题

答案 1 :(得分:0)

Makefile中有错误。

必须在定义针对目标采取的操作的行上使用制表符,例如这些行:

default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

行必须从该行的开头到${MAKE}都有一个标签。您需要在那里强制使用制表符,否则您将看到错误。

Make语法非常特别关于此要求,这是一个容易犯的错误。如果您使用像vim这样的编辑器,它通常会以红色突出显示用户的空格字符,以便他们能够理解那里存在错误。

答案 2 :(得分:0)

您没有显示为了获得此错误而运行的make命令。但是,这样的错误通常意味着您的目录中有一个名为default的文件或子目录。 Make想要构建目标,makefile中的第一个目标是default。它没有定义的先决条件,这意味着如果它存在,make假定它是最新的,并且不需要做任何事情来构建它(它存在,并且它不依赖于其他任何东西)。

你应该使用这个:

.PHONY: default clean

宣布defaultclean目标为“虚假”;这告诉make即使这些目标已经存在,它仍然应该始终运行与它们相关的配方。

答案 3 :(得分:0)

错误的发生是由于在Makefile中为头文件或内核源代码指定的路径,因为标签KERNEL_SOURCE无法找到您已经提到过的标题。而不是将路径改为/usr/src/linux-headers-3.8.0-29到/ usr / src / linux。

将Makefile中给出的路径更改为您拥有源代码的内核的实际版本,或者如果您运行的是同一个内核,则可以通过uname命令获取该版本。

更好的方法可能是:

default:
    $(MAKE) -C /usr/src/$(shell uname -r)/ M=$(shell pwd) modules