错误:stdio.h:make期间没有此类文件或目录错误

时间:2013-03-27 15:18:00

标签: c ubuntu gnu-make

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

3 个答案:

答案 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

希望它有所帮助!