【问题标题】:Linux makefile exampleLinux 生成文件示例
【发布时间】:2013-10-07 11:27:01
【问题描述】:

您好,我是 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

【问题讨论】:

    标签: c linux makefile


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

    【讨论】:

      【解决方案2】:

      您的 Makefile 中有错误。

      必须在定义对目标执行的操作的行上使用制表符,例如行:

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

      必须从行首到${MAKE}有一个制表符。您需要在此处强制使用制表符,否则会发生您目睹的错误。

      Make 语法对这个要求非常特别,而且很容易出错。如果您使用 vim 之类的编辑器,它通常会向用户显示以红色突出显示的空格字符,以便他们了解那里存在错误。

      【讨论】:

        【解决方案3】:

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

        你应该使用这个:

        .PHONY: default clean
        

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

        【讨论】:

          【解决方案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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-07
            • 1970-01-01
            • 2019-09-22
            • 2021-07-31
            相关资源
            最近更新 更多