logo
code:Haemophilus influenzae

ここに書かれていることは無保証です。同じことを行って問題が発生しても、 龍義は責任をとりません。

2006年3月31日

戻る

w3m の configure のエラー。

w3m の configure で、以下のエラーが出た。

checking size of long long... configure: error: cannot compute sizeof (long long), 77
See `config.log' for more details.

環境は RedHat9 / FedoraCore4 での Linux 。これを調べてみる。まず、この
環境でやったことは、 w3m で必要な libgc である Boehm GC をインストール
したこと。これは、 source をとってきて ./configure; make install ぐらいを
したのみ。w3m のバージョンは最新(と言っても、日付は2004年か…)の、0.5.1
を使った。これを解凍して configure すると。

[toyota@kashyyyk]% ./configure
〜snip〜
checking size of long long... configure: error: cannot compute sizeof (long long), 77
See `config.log' for more details.

調べてみたのだけど、ここに

export LDFLAGS='-Xlinker -R/usr/local/lib'

とするとうまくいく、ということが書いてあった。確かにうまくいったのだけど、
元記事にはよくわからないけど、やってみた、とか書いてあるし、なんとなく
納得いかないので調べてみた。-Xlinker はリンカに渡すオプションという意味で、
このあとのオプションはリンカに渡されるようである。つまり、 -R/usr/local/lib
の部分がリンカに渡される。なので、 ld を調べてみたのだけど、 -R のオプション
は、なんかファイル名の指定をするみたいな感じ、と思ったが、ちゃんと書いて
あった。

For  compatibility  with other ELF linkers, if the -R option is followed by a
directory name, rather than a file name, it is treated as the -rpath option.

だそうだ。なので、正確には、

export LDFLAGS='-Xlinker -rpath /usr/local/lib'

とするようである。解決方法はわかったが、原因がわからない。調べてみることに
した。
configure の中で、エラーを起きている部分を見た。以下のプログラムのコンパイル
に失敗しているようである。

long longval () { return (long) (sizeof (long long)); }
unsigned long ulongval () { return (long) (sizeof (long long)); }
#include <stdio.h>
#include <stdlib.h>
int
main ()
{

  FILE *f = fopen ("conftest.val", "w");
  if (! f)
    exit (1);
  if (((long) (sizeof (long long))) < 0)
    {
      long i = longval ();
      if (i != ((long) (sizeof (long long))))
    exit (1);
      fprintf (f, "%ld¥n", i);
    }
  else
    {
      unsigned long i = ulongval ();
      if (i != ((long) (sizeof (long long))))
    exit (1);
      fprintf (f, "%lu¥n", i);
    }
  exit (ferror (f) || fclose (f) != 0);

  ;
  return 0;
}

本当はヘッダの部分にもう少し色々とつくのだけど、無くても問題が全くない。
まず、これを、一般ユーザでコンパイルしてみるが、問題なくコンパイルと、
実行はできる。じゃ、 configure はどうやってコンパイルをしているのか、
見てみた。

gcc -o conftest -g -O2 -I./libwc -I/usr/kerberos/include conftest.c -lm -lbsd -lnsl -ldl -lgc

のようである。一般ユーザで、このオプションをつけてコンパイルをしてみた。

[toyota@kashyyyk]% gcc -o conftest -g -O2 -I./libwc -I/usr/kerberos/include conftest.c -lm -lbsd -lnsl -ldl -lgc
[toyota@kashyyyk]% ./conftest
./conftest: error while loading shared libraries: libgc.so.1: cannot open shared object file: No such file or directory

だそうだ。少しやってみたら、 gcc -lgc conftest.c ではこのエラーが起きて、
gcc conftest.c では問題が起きないことがわかった。つまり、 Boehm GC の
ライブラリに問題があるようである。 ldd でコンパイルしてできたバイナリを
みてみた。

[toyota@kashyyyk]% ldd ./conftest
        linux-gate.so.1 =>  (0x00149000)
        libm.so.6 => /lib/libm.so.6 (0x00a32000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x0634b000)
        libdl.so.2 => /lib/libdl.so.2 (0x00a58000)
        libgc.so.1 => not found
        libc.so.6 => /lib/libc.so.6 (0x00906000)
        /lib/ld-linux.so.2 (0x008e8000)

原因はわかったけど、どこを探しているか気になったので見てみた。

[toyota@kashyyyk]% strace ./conftest
open("/lib/tls/i686/sse2/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/sse2/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/tls/libgc.so.1", O_RDONLY)   = -1 ENOENT (No such file or directory)
open("/lib/i686/sse2/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/i686/libgc.so.1", O_RDONLY)  = -1 ENOENT (No such file or directory)
open("/lib/sse2/libgc.so.1", O_RDONLY)  = -1 ENOENT (No such file or directory)
open("/lib/libgc.so.1", O_RDONLY)       = -1 ENOENT (No such file or directory)
open("/usr/lib/tls/i686/sse2/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/tls/i686/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/tls/sse2/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/tls/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/i686/sse2/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/i686/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/sse2/libgc.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libgc.so.1", O_RDONLY)   = -1 ENOENT (No such file or directory)

結構探しているみたい。原因と対策をまとめてみた。

原因、Boehm GC のライブラリが見つからない。
自分でコンパイルした人は、何も指定しないと /usr/local/lib にインストール
されるのだけど、そのライブラリが見つからないのため、起きる。

対策1、/usr/lib にリンクを張る
やってみた。

[toyota@kashyyyk]% ln -s /usr/local/lib/libgc.so.1.0.2 libgc.so.1

これでうまくいった。

対策2、Boehm GC を /usr/lib にインストールする。
Boehm GC を configure するときに --prefix=/usr として make install する。
面倒なので、試してない。

対策3、LD_LIBRARY を指定してみる。

bash 系だと

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"

LD_LIBRARY が設定されていない場合は。

export LD_LIBRARY_PATH="/usr/lib:/usr/local/lib"

な感じ。csh 系では。

setenv LD_LIBRARY_PATH "${LD_LIBRARY_PATH}:/usr/local/lib"

LD_LIBRARY が設定されていない場合は。

setenv LD_LIBRARY_PATH /usr/lib:/usr/local/lib

これでもうまくいく。

対策4、上記の

export LDFLAGS='-Xlinker -rpath /usr/local/lib'

を行う。

どれかを行えば、良いはずである。


by Tatsuyoshi
since 2003