- ベストアンサー
Linux C言語開発でのインクルードについて
- LinuxでC言語開発をする際にはインクルードしたいヘッダファイルが既定の場所に存在しないため、別の場所に保存されています。
- インクルードファイルが存在しないとコンパイルエラーが発生するため、この問題の解決方法を知りたいです。
- 環境変数C_INCLUDE_PATHを変更・追加することで、インクルードする参照先を指定することができます。また、他にも良い方法があれば教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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カーネル開発で普通に出てくるマクロが理解してもらえないという問題があるように思うのですが、最近は改善したのでしょうか。
その他の回答 (2)
- wormhole
- ベストアンサー率28% (1626/5665)
>コンパイルする度にいちいち指定するのは面倒だと思います。(gcc -I) そういうのはMakefileで書くので「いちいち指定する」ということはないです。 気になるのは必要と思われているヘッダファイルは カーネルやドライバの開発用のもので それ以外では使うことは通常ないはずなのですが 本当に必要なのでしょうか? 使ってはいけないというわけではないですが 作った物はカーネルに依存してしまいますよ。
お礼
回答有難うございます。 makeの役割をちゃんと理解していないということになりますね。再度makeについて勉強しなおすことにします。 おっしゃるとおり、私はカーネルモジュールとドライバ開発を最終的な目標としています。C言語もこれからなので、時間はかかりますが。
- Wr5
- ベストアンサー率53% (2173/4061)
>コンパイルする度にいちいち指定するのは面倒だと思います。(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が不安定でビルド処理とかリモートから実行できませんし。 他にも、カーネルモジュールのソースパッケージとか、参考になりませんか? # 決め打ちしているからシンボリックリンク貼れ…なんてのもあるかも知れませんが。
お礼
回答ありがとうございます。 ネットで公開しているカーネルモジュールのソースを参考にもう一度調べ直します。
お礼
回答有難うございます。 やっぱりIDEはカーネルモジュールの開発に合わないのですね。 確かに参考書の通りにコード書いても関数が存在しないとかエラーがでています。 関数の補完とかしてくれるかもと思ってインストールしたのですが、合わないかもしれませんね。 皆さん適切な回答を親切にお教えくださいまして助かりました。これで参考書もようやく先に進むことができると思います。