[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:29587] Re: #include<linux/sched.h> のエラー



佐野@浜松です。

In <20010819011444.410E.PISOGOO@xxxxxxxxx>,
  on "Sun, 19 Aug 2001 01:28:25 +0900',
   with "[debian-users:29567] #include<linux/sched.h> のエラー",
 Masatoshi Iwasaki <pisogoo@xxxxxxxxx> さん wrote:

> 問題を一言でいうと、#include<linux/sched.h>
> の一行を入れると、sched.hもしくはsched.hの
> インクルードするファイルから大量のエラーが出て
> コンパイルが出来ないという現象です。

> 以下に私の環境でその現象を確認したサンプル
> のソースを載せます。このソースでは、sched.hを
> ただインクルードしてるだけで、sched.hで宣言
> されている変数や関数は使っていませんが、最初に
> この現象に遭遇したときはsched.h内のjffiesを参照
> しようとしたときでした。hello_sched.cをhello.cと
> してコンパイルするとエラーがでます。hello_nosched.c
> をhello.cとした場合は、エラーもちゃんと出ずに
> insmod,rmmodともにできます。
> 
> --------------hello_sched.c-----------------
> 
> #include <linux/kernel.h>
> #include <linux/module.h>
> #include <linux/sched.h>
> 
> #if CONFIG_MODVERSIONS==1
> #define MODVERSIONS
> #include <linux/modversions.h>
> #endif
> 
> int init_module()
> {
> 	printk("Hello, world with sched.h\n");
> 
> 	return 0;
> }
> 
> void cleanup_module()
> {
> 	printk("Short is the life of a kernel module\n");
> }
> 
> ---------------------------------------------------



> ---------------------Makefile----------------------------
> 
> CC=gcc
> MODCFLAGS := -Wall -DMODULE -D__KERNEL__ 
> 
> hello.o:	hello.c /usr/include/linux/version.h
> 					$(CC) $(MODCFLAGS) -c hello.c
> 
> clean:
> 	rm -rf *.o
> --------------------------------------------------------

上記の hello_sched.c, Makefile を手元の potato なシステムで
試してみましたが、普通に make できましたし、insmod/rmmod も
できましたよ ? もちろん lsmod すると

hello                    360   0 (unused)

という表示が確認できました。

そのまま make しようとすると

 $ make
make: *** `hello.o' に必要なターゲット `hello.c' を make するルールがありません.  中止。
 $ ls
Makefile  hello_sched.c
 $ cp hello_sched.c hello.c       
 $ make
gcc -Wall -DMODULE -D__KERNEL__  -c hello.c
hello.c:8: linux/modversions.h: そのようなファイルやディレクトリはありません
make: *** [hello.o] エラー 1

というエラーが出たので、info gcc して

Environment Variables Affecting GCC

の項目で

`C_INCLUDE_PATH'
`CPLUS_INCLUDE_PATH'
`OBJC_INCLUDE_PATH'
     These environment variables pertain to particular languages.  Each
     variable's value is a colon-separated list of directories, much
     like `PATH'.  When GCC searches for header files, it tries the
     directories listed in the variable for the language you are using,
     after the directories specified with `-I' but before the standard
     header file directories.

を確認してから、普段カーネルを make しているディレクトリを引けるように

 $ C_INCLUDE_PATH=/Work/Kernel/package/2.2.19/kernel-source-2.2.19/include/ make
gcc -Wall -DMODULE -D__KERNEL__  -c hello.c
hello.c: In function `init_module':
hello.c:13: warning: implicit declaration of function `printk_Rdd132261'
 $ ls -l
合計 16
-rw-rw-r--    1 sano     sano          151 Aug 21 02:22 Makefile
-rw-rw-r--    1 sano     sano          316 Aug 21 02:23 hello.c
-rw-rw-r--    1 sano     sano         1224 Aug 21 02:25 hello.o
-rw-rw-r--    1 sano     sano          316 Aug 21 02:22 hello_sched.c

と環境変数 C_INCLUDE_PATH を定義してから make しただけです。
 warning は出ましたが、一応 hello.o が make できています。

> Googleで英語サイトも調べて見ましたが、これといって決め手になる
> ものはありませんでした。どれも最後は「ソースコードを落とし直して
> もう一度コンパイル」という方法が勧められていて、先ほど書いたように
> それも試したのですが、だめでした。/usr/include/linuxや/usr/include/asm
> がちゃんとカーネルソースにリンクしているかも確認してあります。

ふつう、Debian 上では /usr/include/linux や /usr/include/asm などは
 libc6-dev パッケージに附属のもので、カーネルの構築に利用される
ソースツリーにはリンクされていないはずだと思うのですが。

なお、利用しているカーネルは 2.2.19 で、kernel-source-2.2.19 に
含まれる tar.bz2 を展開したものです。

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)