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'
を行う。
どれかを行えば、良いはずである。
|