FreeBSD QandA 509

FreeBSD QandA

Q. Xlib を用いた C プログラムをコンパイルすると
      % cc file.c -lX11
      file.c:1: X11/Xlib.h: No such file or directory
      file.c:2: X11/Xutil.h: No such file or directory
   と、エラーになってしまいます。

A. そのソースコードには
      #include <X11/Xlib.h>
      #include <X11/Xutil.h>
   と書いてあるはずですが、このファイルが見付からなかったということです。

   #include 命令で インクルードされるファイルの指定には "" で囲む方法
   と <> で囲む方法の2通りがあります。

   C コンパイラ (正確にはプリプロセッサ) は
      #include "file.h"
   と書いてあった場合、インクルードファイルを ソースファイルと同じ
   ディレクトリの中から探し、もし見付からなければ次に標準のディレクトリ
   から探します。

   一方、
      #include <file.h>
   と書いてあった場合は、ソースファイルと同じディレクトリは探さずに、
   最初から標準のディレクトリだけを探します。

   通常 標準のディレクトリは、/usr/include/ になっていますので、
   /usr/include/X11/Xlib.h や /usr/include/X11/Xutil.h が存在しないため
   上記のエラーが発生したのです。

   X11/Xlib.h や X11/Xutil.h などの X の include ファイルは 
   /usr/X11R6/include/ に置いてあるため、この問題を回避するには
   コンパイラが /usr/X11R6/include/ を探すようにすればいいわけです。

   以下に示す解決策のうち、いずれかを選んで下さい。

   1. -I オプションで、インクルードファイルが置いてあるディレクトリを
      指定できます。コマンドラインからは、
         % cc file.c -I /usr/X11R6/include
      などと入力します。この例では、標準のディレクトリである
      /usr/include と、-I で指定した /usr/X11R6/include から
      インクルードファイルを探します。

      ただし、最終的にリンク時にライブラリが見付からないというエラーに
      なるでしょうから、
         % cc file.c -I /usr/X11R6/include -lX11 -L /usr/X11R6/lib
      としなければいけません。→[管理番号 1609]

   2. imake/xmkmf (Imakefile というファイルがある場合) や autoconf
      (configure というファイルがある場合) などの、Makefile を自動的に
      生成するツールを使っているものは、インクルードファイルの検索対象
      ディレクトリを指定するためのオプションが用意されていることが
      多いです。それぞれのプログラムに付属するドキュメントをよく読んで
      みましょう。

間違い・追加情報を見付けた場合は、 修正案の投稿のしかた を読んだ上で、
QandA@jp.FreeBSD.org まで お知らせください。