よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

CentOS7 詳解UNIXプログラミング CentOS環境でのapue.hの準備

少し前に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はこの本用に用意されたヘッダファイルっぽく、以下サイトからダウンロード出来ます。

Source Code

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 にディレクトリを引数で渡せば動くと思います。
なんとか、開始数ページで脱落するのを回避出来ました…