6 c++ linux gcc makefile header-files
我将在Ubuntu 10.10中编写一个Hello World模块(内核为2.6.35-28-generic).标题位于:
/usr/src/linux-headers-2.6.35-28-generic
Run Code Online (Sandbox Code Playgroud)
你好ç:
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("Hello, world\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye\n");
}
Run Code Online (Sandbox Code Playgroud)
和Makefile:
CC = gcc
CFLAGS = -Wall -DMODULE -D__KERNEL__
hello.o: hello.c
$(CC) $(CFLAGS) -c hello.c
echo insmod hello.o to install
echo rmmod to delete
Run Code Online (Sandbox Code Playgroud)
make时出错:
hello.c:1:致命错误:linux/kernel.h:没有这样的文件或目录编译终止.
我该如何解决这个问题?
你不能只使用传统风格Makefile的Linux内核模块; 虽然你可能会强迫某些东西上班,但这将是一次痛苦的经历.
首先阅读Documentation/kbuild/modules.txt文件; 它将准确描述在编写模块时您需要做什么,Makefile以便它可以整齐地挂钩到内核的Kbuild环境中.您Makefile可能会看起来像这样:
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := 8123.o
8123-y := 8123_if.o 8123_pci.o 8123_bin.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
# Module specific targets
genbin:
echo "X" > 8123_bin.o_shipped
endif
Run Code Online (Sandbox Code Playgroud)
请相信我; 虽然你可能认为自己"只是一个小小的改变" Makefile,但即使是内核版本的微小改动也会彻底破坏你的构建.现在花点时间为你的模块写一个Kbuild兼容Makefile的.我浪费了几周的生命,试图在引入基础设施Makefile时保持预先存在Kbuild.每一个新内核都让我失去了数小时的生产力.
您是否有 /usr/src/linux 到 /usr/src/linux-headers-2.6.35-28-generic 的符号链接?如果没有,则使用以下命令创建一个
# cd /usr/src
# ln -sfn linux-headers-2.6.35-28-generic linux
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22513 次 |
| 最近记录: |