X Window Programming

| Index | Step 2 |

Step1:必要なファイルがどこにあるか探す

[1] に載っている簡単なプログラムをコンパイル/実行してみます。以下がソースです。
/* 0201.c ; connect and disconnect display */

#include <X11/Xlib.h>;
#include <X11/Xutil.h>;
#include <stdio.h>

void
main()
{
  Display *d;

  d =XOpenDisplay(NULL);
  XCloseDisplay(d);
}
これを見てわかる通り、X Window のプログラムを行なうには上のファイルをインクルードする必要があります。ヘッダファイルの場所については [1] には /usr/include/X11/... と書いてありましたが探してみたところ以下のようになりました。

ヘッダファイル名(私の環境では) 主な内容
/usr/local/X11R6.4/include/X11/Xlib.h マクロおよび構造体
/usr/local/X11R6.4/include/X11/X.h シンボルの定義
/usr/local/X11R6.4/include/X11/Xutil.h マクロおよび構造体

なお、X.hXlib.h からインクルードされるので明示的に指定する必要はありません。また、これをコンパイルするには Xlib というライブラリが必要です。そのためにコンパイル時に -lX11 というオプションをつけます。このライブラリを探してみたところ、/usr/local/X11R6.4/lib/libX11.so がそれのようです。

コンパイルをするために gcc 用の環境変数の設定をします。
インクルードファイルを読み込むためのパスを C_INCLUDE_PATH に設定します。

setenv C_INCLUDE_PATH "/usr/local/X11R6.4/include:"
ライブラリのパスについては不要なものも入っていると思いますが
setenv LD_LIBRARY_PATH "/usr/lib:/usr/local/lib:/usr/local/gnu/lib: 
   /usr/local/X11R6.4/lib:/usr/5lib:"
(本当は 1 行です)としておきました。
では、コンパイルしてみます。
shin@harp% gcc 0201.c -lX11 Undefined first referenced symbol in file socket /usr/local/X11R6.3/lib/libX11.so getpeername /usr/local/X11R6.3/lib/libX11.so xdrmem_create /usr/local/X11R6.3/lib/libX11.so gethostbyname_r /usr/local/X11R6.3/lib/libX11.so setsockopt /usr/local/X11R6.3/lib/libX11.so authdes_create /usr/local/X11R6.3/lib/libX11.so inet_addr /usr/local/X11R6.3/lib/libX11.so shutdown /usr/local/X11R6.3/lib/libX11.so getsockname /usr/local/X11R6.3/lib/libX11.so getservbyname_r /usr/local/X11R6.3/lib/libX11.so connect /usr/local/X11R6.3/lib/libX11.so ld: fatal: Symbol referencing errors. No output written to a.out
どうやら他にライブラリを指定しなければいけないらしいようです。が、シンボル名から想像して -lsocket を指定してみるとうまくいきました。
これでなんとか動いたので、以下のような Makefile を作っておきます(下手なところは笑って許してね)。
# Makefile of X window programs.
#           Written by Shin SAITO

TARGETS = 0201
LDFLAGS = -lX11 -lsocket
WFLAGS = -Wall

.PHONY: $(TARGETS)

all: $(TARGETS)

$(TARGETS): %: %.c
        gcc $< -g -o $@ $(LDFLAGS) $(WFLAGS)

clean:
	rm -f $(TARGETS) a.out core
これで実際のプログラムができるようになりました。
| Index | Step 2 |
| Technical Report | Title Page |
Shin SAITO: shin@yl.is.s.u-tokyo.ac.jp