7

Ubuntuで次のプログラムをコンパイルしようとしています。しかし、「stdio.h: そのようなファイルまたはディレクトリはありません」というエラーが表示され続けます。

#include <stdio.h>

int main(void)
{
  printf("Hello world");
}

私のメイクファイルは次のとおりです。

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 コードでは使用できません

を使用する代わりにstdio.h、次のインクルードを使用する必要があります

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

を使用する代わりに、使用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

問題は、カーネル内で and を使用できず、関数も使用しないことprintf()です。あなたが必要とし、stdio.hmain()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 が正しくありません。多くのチュートリアルの 1 つを参照してください。たとえば、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 に答える