我正在尝试在Ubuntu中编译以下程序。但我一直收到错误:“stdio.h:没有这样的文件或目录”错误。
#include <stdio.h>
int main(void)
{
printf("Hello world");
}
我的makefile是:
obj-m += hello.o
all:
make -I/usr/include -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
答案 0 :(得分:16)
构建程序的方法是构建内核模块而不是程序应用程序的方法。并且在内核开发的环境中不存在stdio.h
,这就是导致错误的原因:
error: "stdio.h: No such file or directory" error
1)如果你想构建一个linux应用程序,那么你的Makefile就错了:
您应该修改您的Makefile
使用以下Makefile:
all: hello
test: test.c
gcc -o hello hello.c
clean:
rm -r *.o hello
2)如果你想构建一个内核模块,那么你的c代码是错误的
stdio.h
。它不是
存在于内核开发的环境中,这就是你的原因
得到错误main()
C代码printf()
C代码stdio.h
的INSTEAD ,您必须使用以下内容
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
使用int main() {
的INSTEAD ,你必须使用
int init_module(void) {
INSTEAD 使用printf()
使用printk()
使用以下hello module代替您的问候代码
/*
* hello-1.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
有关内核模块开发的更多详细信息,请参阅以下link
答案 1 :(得分:4)
问题是您无法在内核中使用printf()
和stdio.h
,也不会使用main()
函数。您需要printk()
和module.h
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello world\n");
return 0;
}
卸载时还应该有exit()
/ cleanup()
类型函数。
void clean_module(void)
{
printk(KERN_INFO "Cleaning and exiting\n");
}
然后加载模块的功能:
module_init(init_module);
module_exit(clean_module);
答案 2 :(得分:0)
您的Makefile不正确,请查看众多教程中的一个,例如:http://mrbook.org/tutorials/make/
构建独立应用程序的最简单的Makefile应该是这样的:
all: hello
hello: hello.o
gcc hello.o -o hello
hello.o: hello.cpp
gcc -c hello.cpp
clean:
rm -rf *o hello
希望它有所帮助!