7

我正在尝试在 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
4

3 回答 3

24

您构建程序的方式是构建内核模块而不是 c 程序应用程序的方式。并且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 代码中使用

代替using stdio.h,您必须使用以下 include

#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */

代替using int main() {,你必须使用

int init_module(void) {

而不是使用 printf()使用printk()

使用以下hello 模块而不是您的 hello 代码

/*  
 *  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");
}

有关内核模块开发的更多详细信息,请参阅以下链接

于 2013-03-27T15:23:14.910 回答
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);
于 2013-03-27T15:41:22.860 回答
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

希望能帮助到你 !

于 2013-03-27T15:22:15.427 回答