Linux C言語開発でのインクルードについて

このQ&Aのポイント
  • LinuxでC言語開発をする際にはインクルードしたいヘッダファイルが既定の場所に存在しないため、別の場所に保存されています。
  • インクルードファイルが存在しないとコンパイルエラーが発生するため、この問題の解決方法を知りたいです。
  • 環境変数C_INCLUDE_PATHを変更・追加することで、インクルードする参照先を指定することができます。また、他にも良い方法があれば教えてください。
回答を見る
  • ベストアンサー

Linux C言語開発 インクルードについて

C言語開発初心者です。 LinuxでC言語開発をするにあたり、どのディストリビューションにしても インクルードしたいヘッダファイルが既定の場所には無く別の場所にカーネルのバージョンごとに保存されているようなのです。 このままコンパイルを試みるとインクルードファイルが存在しませんとエラーが返ります。 既定のヘッダファイルの保存場所にはC言語開発に必要なヘッダファイルが存在しませんので、この問題を皆さんはどのように解決しておりますか?どなたかご教授お願いいたします。 C言語でincludeする場所は<>でくくった場合 /usr/include/ 以下を参照する設定になっていると思うのですが、 例えばmodule.h やinit.h などの開発用ヘッダファイル?を探してみると /usr/include/linux/ には存在せず、 find / -name module.h と入力して検索してみると /usr/src/kernels/2.6.32-131.21.1.el6.i686/include/linux/module.h と別な場所にあります。 ネットであれやこれや調べてみても コンパイル時にincludeの参照先を指定する方法はあるようなのですが、 コンパイルする度にいちいち指定するのは面倒だと思います。(gcc -I) かといって開発しているカレントディレクトリにヘッダファイルをコピーしても includeするヘッダファイルが別のヘッダファイルを参照することもあるようなので、 あまり現実的ではないようです。 一番安全な方法としてincludeする参照先が環境変数か何かで追加及び変更するのではないかと思います。 試してみましたがenvコマンドで表示されるOSの環境変数とは別のもののようなのです。 環境変数 C_INCLUDE_PATH とはどのようにして変更・追加するのでしょう? また、上記の方法以外で良い方法がございましたらそれでもかまいません。 よろしくお願いいたします。 開発環境 ・OS centos6 ・以下のパッケージはインストール済み kernel-headers-2.6.32-131.21.1.el6.i686 kernel-devel-2.6.32-131.21.1.el6.i686 make-3.81-19.el6.i686 gcc-4.4.5-6.el6.i686 ・GUI開発環境 netbeans ・uname -r 実行結果 2.6.32-131.21.1.el6.i686

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

module.hとか登場するのはlinuxのkernel moduleの開発をしている場合だけだと思いますが、普通は手動でgccのコンパイルオプションを指定することはないですね。 例えば、次のところであるようにobj-m変数にコンパイルして出来るオブジェクトファイルの名前 (ソースファイルの.cを.oに変えたもの) を加えた次のようなmakeファイルを作ってコンパイルするのが普通です。 http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html こうすると、/usr/src/kernels/2.6.32-131.21.1.el6.i686/build以下のmakefileがよしなに計らってくれます。 Linux kernel module developmentなどで検索して出てくるウェブサイトを色々と見てみてください。 あと、個人的にはIDEを使っているカーネル開発者って見た事無いですね。 大抵、タグジャンプを設定した上で、emacsかviかのように思います。 一部ファイルを変えたらその読み込みなどですごく待たされるという問題や、Linuxカーネル開発で普通に出てくるマクロが理解してもらえないという問題があるように思うのですが、最近は改善したのでしょうか。

yan156
質問者

お礼

回答有難うございます。 やっぱりIDEはカーネルモジュールの開発に合わないのですね。 確かに参考書の通りにコード書いても関数が存在しないとかエラーがでています。 関数の補完とかしてくれるかもと思ってインストールしたのですが、合わないかもしれませんね。 皆さん適切な回答を親切にお教えくださいまして助かりました。これで参考書もようやく先に進むことができると思います。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.3

>コンパイルする度にいちいち指定するのは面倒だと思います。(gcc -I) そういうのはMakefileで書くので「いちいち指定する」ということはないです。 気になるのは必要と思われているヘッダファイルは カーネルやドライバの開発用のもので それ以外では使うことは通常ないはずなのですが 本当に必要なのでしょうか? 使ってはいけないというわけではないですが 作った物はカーネルに依存してしまいますよ。

yan156
質問者

お礼

回答有難うございます。 makeの役割をちゃんと理解していないということになりますね。再度makeについて勉強しなおすことにします。 おっしゃるとおり、私はカーネルモジュールとドライバ開発を最終的な目標としています。C言語もこれからなので、時間はかかりますが。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>コンパイルする度にいちいち指定するのは面倒だと思います。(gcc -I) その為にmakefile書くのではないですか? 私自身はLinuxでプログラム書いたりしたことはありませんが…。 # SRPMから、野良ビルドなパッケージ作ったり…とかはありますが。 r8168のソースアーカイブでも… KVER := $(shell uname -r) KDIR := /lib/modules/$(KVER)/build KMISC := /lib/modules/$(KVER)/kernel/drivers/net/ こんな感じで処理しています。 実際のincludeディレクトリは… $(KDIR)/include ですかね。 # 私の場合、KVERに直接対象のカーネルバージョン記述してビルドしていますが。 # 再起動した後だと対象マシンのNICが不安定でビルド処理とかリモートから実行できませんし。 他にも、カーネルモジュールのソースパッケージとか、参考になりませんか? # 決め打ちしているからシンボリックリンク貼れ…なんてのもあるかも知れませんが。

yan156
質問者

お礼

回答ありがとうございます。 ネットで公開しているカーネルモジュールのソースを参考にもう一度調べ直します。

関連するQ&A

  • linux/module.h インクルードできない

    もう自力ではわからず、検索しても解決できなかったので、わかる方、力を貸してください。 まず環境は Ubuntu 12.10 をVirtualBoxで動かしています。 そして、以下のパッケージをインストールしました。 linux-source-3.5.0 linux-header-3.5.0-19-generic その後、以下のソースをコンパイルしようとしました。 1 #include <linux/module.h> /* module 作成には必須 */ 2 #include <linux/kernel.h> /* printk */ 3 4 MODULE_LICENSE( "GPL" ); 5 6 static char* msg = "module [message.o]"; 7 8 9 /* 10 * モジュールの初期処理 11 * insmod 時に呼ばれる 12 */ 13 int 14 init_module( void ) 15 { 16 printk( KERN_INFO "%s : loaded into kernel\n", msg ); 17 18 /* モジュール初期化に成功したので 0 を返す 19 0 以外の値を返せば初期化失敗とみなされモジュールは 20 カーネルには組み込まれない */ 21 return 0; 22 } 23 24 25 /* 26 * モジュールの解放処理 27 * モジュールの参照数が 0 であれば、rmmod 時に呼ばれる 28 */ 29 void 30 cleanup_module( void ) 31 { 32 printk( KERN_INFO "%s : removed from kernel\n", msg ); 33 } 34 35 36 /* End of message.c */ このソース自体はネットで公開されていたもののコピペです。 これを解説を読んで、いざコンパイルというときに、 linux/module.h そのようなファイルやディレクトリはありません 上のエラーが出ます。 でも、/usr/src/linux-source-3.5.0/include/linuxの中に、module.hは確かにありました。 あったのにもかかわらず、そのようなファイルやディレクトリがありませんというのは、いったいどのような原因が考えられるのでしょうか。 自力では解決できなかったので、わかるかた教えてください。

  • C言語の開発環境

    C言語のクオリティの高いフリーの開発環境を探しています。 Javaの開発環境として、Eclipseが良かったので、C言語も Eclipseでやってみたものの、Javaに比べて、自動的に文法 チェックや関数の補完、コンパイルへのショートカットがない、 コンパイルがかなり面倒と結構つかいにくく、他にいいのが ないか探しています。 C言語のオススメの開発環境、教えてください。

  • linuxの/usr/includeについて

    (1)gccは、オプションを指定しないで、/usr/include以外のヘッダーファイルを見に行きますか? (2)/usr/includeの中はディストリビューションによって異なりますか? (3)/usr/includeはアプリケーションなどをインストールしたりして、増えたりするものなんでしょうか?

  • include の場所

    Fedora10でvmwareを使っていましたが、定期的なupdate systemで環境が変わったみたいで、使用できなくなりました。 どうやら、kernelの C header files がないようです。 /usr/src/linux/include の場所が変わったのでしょうか? どの場所に変わったか?教えていただけませんか? kernel 2.6.27.29 gcc 4.3.2

  • C言語からjavaを呼び出したい

    C言語からjavaを呼び出したいのでjniを使うことにしました。 各言語のソースはWebで見つけたサンプルを見ながら何とか作成し、各々コンパイルまで終わったのですが、javaのオブジェクト(?)をどこに置いたら良いのかさっぱりわかりません。 java使いの人達には常識の話だと思いますがjavaはサーブレットしか作ったことが無くどうしたものかと困っています。 分からないのは次の2点です。 1.classファイルのままでも良いのかjarにしないといけないのか? 2.どこに設置したら良いのか? これまでやったこと 1.javaのソースを作成しコンパイルしました(classファイルのままです) 2./etc/profileに次のコマンドを追加しました。 LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/java/jdk1.7.0_03/jre/lib/amd64/server export LD_LIBRARY_PATH 3.C言語のソースを次のコマンドでコンパイルしました。 % gcc -I/usr/java/jdk1.7.0_03/include/ -I/usr/java/jdk1.7.0_03/include/linux -L/usr/java/jdk1.7.0_03/jre/lib/amd64/server -ljvm -lpthread jnitest.c -o jnitest 4.javaモジュールの設置←これがわかりません 初歩的な質問で申し訳ありませんがご教示下さい。

    • ベストアンサー
    • Java
  • windowsでLinuxで作成したソースをコンパイル

    Linuxで作成、 $gcc -Wall file.c で、通ったファイルをWindowsでも同様に通したいので、MinGWを使って、コンパイルしたのですが、 #include <sys/socket.h> の構文で引っかかってしまいました。どうやらインクルードファイルが無いようでしたので、 C:\MinGW\include C:\MinGW\lib 以下に、Linuxの /usr/include/ /usr/lib/ 以下のファイルをそのまま入れて、再度実行しました。 ヘッダーファイルは見つけて読んでくれたのですが、そのヘッダーファイルに書いてある関数(例:htons(), socket(), inet_addr(), connect())が参照できないとの事で、怒られてしまいます。 Linuxのライブラリファイルをそのまま入れたのがまずかったのかもしれないのですが、こいつのエラーを解消する有効手段が見つかりません。 問題解決のヒント、又は答えを教えていただけませんでしょうか。 どうか、お願い致します。

  • コンパイルエラー「include ファイルを開けません」

    あるプログラムをコンパイルしたところ、 下記コンパイルエラーが発生しました。 ヘッダファイルが開けないようなのですが、 これは自分の開発環境に必要なファイルが足りないのでしょうか? 解決する方法が分からないので、ご存知の方おられましたら ご教示お願い致します。 環境はVC++2005でフルインストールしています。 fatal error C1083: include ファイルを開けません。'WtsApi32.h': No such file or directory

  • Linux環境におけるgetprocs関数

    お疲れ様です、初めてLinux環境で開発(C言語)している者です。 流用元(HP-UX環境/C言語)のソースをコンパイルしたところ、 「getprocs」(プロセス情報の取得?)という関数でエラーになりました。 <procinfo.h>というヘッダをincludeしているのですが、 このヘッダファイルも見当たりません。 Linuxでは、使用できない関数なのでしょうか? また、代替手段などあるのでしょうか? getprocs自体、ネットで調査してもあまり有力な情報をヒットできず、苦慮してます。 ご存じの方おりましたら、ご教授よろしくお願いいたします。

  • fortran:includeできないとエラーがでます

    unix上にtelnetしてプログラムをつくっているのですが、fortranのプログラム中でinclude文を実行するとコンパイル時に Cannot open include file ’ヘッダーファイル名’ と出ます。 読み込むヘッダーファイルは市販のものをインストールしたものでこのファイルは/usr/includeにシンボリックリンクの形で存在しリンク先も存在します。ちなみにヘッダーファイル名を実在しないものにしても同じエラーメッセージが出ます。 なにが原因なのでしょうか。お心当たりのある方はよろしくお願いいたします。

  • C言語:汎用のオブジェクトファイルのパス

    main.cで #include "fileio.h" して、関数の実体等をfileio.cに記述する場合コンパイルについてです。 fileio.hが様々なプログラムで使う関数群の場合で、/home/hoge/mylib 以下に fileio.h と fileio.o を置いたとします。また、main.cは別ディレクトリで開発しているとします。 環境変数C_INCLUDE_PATHを設定しておけばヘッダファイルは参照できました。(main.c内で#include "fileio.h" とするだけで参照できました) makeでコンパイルしたいのですが、オブジェクトファイルはMakefile中で LIBOBJS = /home/hoge/mylib/fileio.o などとフルパスで指定しなければいけないのでしょうか? ファイル入出力関数群など、汎用的な関数をまとめてmylibに置きたいので、どこかでmylibディレクトリのパスを指定して、ファイル名(fileio.o)だけで参照できるならそうしたいのですが。 また、そもそも汎用関数群はこういうディレクトリ構造で管理したほうがいい、などというアドバイスがあればお願いします。

専門家に質問してみよう