少し前にkindleの技術書半額セールみたいなのがあって、その時に「詳解UNIXプログラミング 第3版」を購入しました。
早速読み進めながらコードを写経しようと思ったのですが、最初のコードからいきなり躓きました。
目次
初っ端からエラー
環境はCentOS7です。
本書で一番最初に記載されているサンプルコードを以下に記載します。
$ cat ls.c #include "apue.h" #include <dirent.h> int main(int argc, char *argv[]) { DIR *dp; struct dirent *dirp; if (argc != 2) err_quit("usage: ls directory_name"); if ((dp = opendir(argv[1])) == NULL) err_sys("can't open %s", argv[1]); while ((dirp = readdir(dp)) != NULL) printf("%s\n", dirp->d_name); closedir(dp); exit(0); }
一部見慣れぬ関数がありますし、そもそもapue.hって聞いたことがないです。このままコンパイルすると…
gcc ls.c -o ls2 ls.c:1:18: fatal error: apue.h: No such file or directory #include "apue.h" ^ compilation terminated.
まぁ案の定駄目です。
apueとは
そもそもapueってなんやねん、と調べてみると「詳解UNIXプログラミング」の原書である「Advanced Programming in the UNIX Environment」の略みたいです。apue.hはこの本用に用意されたヘッダファイルっぽく、以下サイトからダウンロード出来ます。
tarをダウンロードして、makeします。
# cd /usr/local/src # wget http://www.apuebook.com/src.3e.tar.gz # tar xvfz src.3e.tar.gz # cd apue.3e/
READMEを読むとmakeすれば使えそうです。
# make /tmp/ccJ8Homv.o: In function `thr_fn': barrier.c:(.text+0x80): undefined reference to `heapsort' collect2: error: ld returned 1 exit status make[1]: *** [barrier] Error 1 make[1]: Leaving directory `/usr/local/src/apue.3e/threads' make: *** [all] Error 1
はい、失敗しました。
少し調べるとlibbsd、libbsd-develが必要だとわかりました。
CentOS7は通常のリポジトリでは用意されていないので、epelで手に入れます。私は面倒なのでwgetでrpm取ってきました。
# cd /usr/local/src # wget http://elrepo.org/linux/elrepo/el7/x86_64/RPMS/libbsd-0.6.0-3.el7.elrepo.x86_64.rpm # wget http://elrepo.org/linux/elrepo/el7/x86_64/RPMS/libbsd-devel-0.6.0-3.el7.elrepo.x86_64.rpm # rpm -ivh libbsd-0.6.0-3.el7.elrepo.x86_64.rpm # rpm -ivh libbsd-devel-0.6.0-3.el7.elrepo.x86_64.rpm
もう一回makeします。
# cd /usr/local/src/apue.3e/ # make
今度は成功しました。
ライブラリ/ヘッダの配置
以下コマンドで作成したヘッダとライブラリを移動させます。
# cp include/apue.h /usr/local/include/ # cp lib/libapue.a /usr/local/lib/
これで準備は完了です。
再度コンパイル
-lで準備したapueを指定してコンパイルします。
# gcc ls.c -lapue -Wall -o ls2
これでls2 にディレクトリを引数で渡せば動くと思います。
なんとか、開始数ページで脱落するのを回避出来ました…