Linux的makefile文件例子(Linux makefile example)

2019-10-18 17:49发布

您好我是新手到Linux和我通过一个例子来工作我的方式http://www.linuxforu.com/2010/12/writing-your-first-linux-driver/我使用Ubuntu 12.04和所创建的C代码所谓ofd.c(见下文)和文件被保存在我的〜/开发/ MyProgs / myHelloWorldLinuxModule / V2创建的目录。 我还创建了一个Makefile文件(见下文),这是在同一个目录。
我希望看到当我输入做出相同的目录下生成一个.ko文件,但我得到的是一个消息,说“为默认将做什么”

我真的不明白的makefile

我应该定义KERNELRELEASE的地方,

什么是默认实际上做的线,这是否意味着开展做出的内核目录和工作目录或者我应该把我的代码的地方尤其如此。

没有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 – 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

Answer 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 u需要给予正确的名称是这样

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解决问题



Answer 2:

你在你的Makefile中的错误。

必须使用的定义采取的行动打击目标,如线的线制表符:

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

该行必须从线到开始时的标签${MAKE} 您需要强制制表符那里,否则你亲眼目睹了该错误会发生。

美颜语法是很讲究这个要求,这是一个简单的错误作出。 如果你使用像vim编辑器,它通常会显示空格字符的用户以红色高亮显示,使他们能够认识到错误是目前。



Answer 3:

你没有告诉你跑到得到这个错误make命令。 然而,这样的错误通常意味着你有一个文件或子目录命名为default的目录。 让希望建立目标,并在生成文件的第一个目标是default 。 它没有定义的先决条件,这意味着如果它存在,使假定它是由最新的,没有什么需要做的事情来构建它(它的存在,它不依赖于其他任何东西)。

你或许应该这样做:

.PHONY: default clean

申报defaultclean的目标是“假的”; 这告诉make,即使存在这些目标仍应始终运行与他们有联系的配方。



Answer 4:

错误是由于即将到来的缘故,在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


文章来源: Linux makefile example
标签: c linux makefile