[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.h
は Xlib.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 |
これで実際のプログラムができるようになりました。