xmkmf や make がエラーを出さずに正常終了したら、 <@@ref>finalsteps次の節に進んでください。 しかし「実際」には一発でうまく行くことはほとんどありません。 ここで、あなたの知恵が問われるのです。
Link error: -lX11: No such file or directory
というエラーで
make が失敗する場合。これは Imakefile が適切に設定さ
れていないということかもしれません。
Makefile の最初あたりで以下のような行を確認してください:
LIB= -L/usr/X11/lib
INCLUDE= -I/usr/X11/include/X11
LIBS= -lX11 -lc -lm
-L
オプションはライブラリを探す場所をリンカに対して
指定し、-I
オプションはインクルードファイルを探す場
所をコンパイラに対して指定します。この例の場合、 X11のライブラリ
は /usr/X11/lib
ディレクトリにあり、 X11 のインクルードファイルは
/usr/X11/include/X11
ディレクトリでなければなりません。もし、
これがあなたのマシンのディレクトリ構成と違っていたら、
Makefile に適当な変更を加えてから、もう一度 make を
実行してください。
/tmp/cca011551.o(.text+0x11): undefined reference to `cos'
この問題を解決するには、Makefile の LIB と
LIBS に -lm を加えて、明示的に計算ライブラリ
にリンクさせてください(前の例を参照してください)。
make -DUseInstalled -I/usr/X386/lib/X11/config
これは、機能をそぎ落として骨と皮だけにした xmkmf と同じ働きを
します。
# ldconfig を実行すると、共有ライブラリへのシンボリックリンク
が張り直されます。これは必要でないかもしれません。
Makefiles
によっては、あなたのシステムにあるライブラリ
を、識別できないエイリアスで使っていることがあります。例えば、構築に
libX11.so.6
が必要なのに、/usr/X11R6/lib
にはそのような
ファイルやリンクが存在しない場合です。しかし libX11.so.6.1
はあるとします。この場合の解決方法は、
ln -s /usr/X11R6/lib/libX11.so.6.1 /usr/X11R6/lib/libX11.so.6
を root になって実行することです。リンクを張った後には
ldconfig が必要かもしれません。
libX11.so.3.1.0
, libXaw.so.3.1.0
, libXt.so.3.1.0
です。通常は、libX11.so.3 -> libX11.so.3.1.0 といったリン
クが必要です。このソフトウェアにはさらに
libX11.so -> libX11.so.3.1.0 のようなリンクも必要でしょう。
もちろん、「足りない」リンクを作るには、root になって
コマンド ln -s libX11.so.3.1.0 libX11.so を使います。
libc
が必要なこ
とで悪評が高かったです。もっと新しい StarOffice 5.0 でさえ、
新しい glibc 2.1
ライブラリのシステムにインストールすると動作
しません。幸いなことに、さらに新しい StarOffice 5.1 では、こ
ういった問題は解決しています。古いバージョンの StarOffice を
使っているなら、root になって、いくつかのライブラリを適切な
ディレクトリにコピーし、古いライブラリを削除し、それから
シンボリックリンクを再設定する必要があるでしょう(この作業に関する詳し
い情報については、StarOffice miniHOWTO
の最新版を見てください)。
注意: もし、失敗するとシステムが動作しなくなってしまうので、この作
業は十分注意して行ってください。
通常、最新のライブラリは
Sunsite
で入手できます。
No such file or directory
といったエラーメッセージが出る場合。
この場合は、そのファイルが実行可能かどうかパーミッションを確認してくだ
さい。また、スクリプトの最初の行を確認して、スクリプトが呼び出すシェル
やプログラムが正しく指定されているかどうかを確かめてください。
例えば、スクリプトは次のように始まると思います:
#!/usr/local/bin/perl
もし Perl が /usr/local/bin
ではなく
/usr/bin
にインストールされていたらスクリプトは動作しないでしょ
う。これを動作させるには 2 つの方法があります。スクリプトファイルの最
初の行を #!/usr/bin/perl
と書き換えるか、
ln -s /usr/bin/perl /usr/local/bin/perl
を実行して、適切な
ディレクトリへシンボリックリンクを張ってください。
あるパッケージの構築を行うためにシステムに入っていないライブラリが必要
な場合にはリンクエラーが起こります(undefined reference
エラー)。
ライブラリは高価な上に中身が秘密になっているかもしれませんし、何か別の
理由で見つけるのが困難なこともあります。こういった場合には、
静的にリンクしたバイナリをパッケージの作者から入手するか、
Linux のユーザグループから入手するのがもっとも簡単な対処です。
libc 5
ライブラリから libc 6 / glibc 2
ライブラリに移行しました。
古いライブラリで動いていたコンパイル済みバイナリは、ライブラリを
アップグレードすると動かなくなるかもしれません。この問題に対処するには、
アプリケーションをソースからコンパイルしなおすか、新しいライブラリに
対応したコンパイル済みバイナリを入手してください。システムを
libc 6
にアップグレードしようとしていて問題に遭ったなら
Eric Green の Glibc 2 HOWTO を見るとよいでしょう。
glibc
にはバージョン間の互換性のない部分が少しあるので、
glibc 2.1
で作ったバイナリは glibc 2.0
では動かない
かもしれませんし、その逆も起こるかもしれません。
Makefile
のコンパイルオプションから -ansi オプション
を外さなければならないことが時々あります。これを行うと、gcc の
非 ANSI 拡張機能が使えるようになり、その拡張機能を必要とするパッケージ
を構築できるようになります。(この点について指摘してくれた
Sebastien Blondeel に感謝します。)
警告: root に setuid したプログラムはシステムのセキュリティ上 の危険を伴います。root に setuid したプログラムは root 権限で 動作するので、致命的な被害を与える可能性があります。setuid ビットを立 てる前には、可能であればソースコードを読んでて、プログラムが何をするの かを確かめてください。
Makefile を調べて、あなたのシステムに最適なオプションが設定さ れているかどうかを確かめるといいでしょう。例えば、-O2 オプション は最高レベルの最適化を行い、-fomit-frame-pointer オプションは 小さいバイナリを作成します(ただし、デバッグはできなくなります)。 自分が何をやっているか分からない場合や、どんな場合であれうまく 構築できることが確かめられる前にはこれらのオプションをいじら ないようにしてください。
私の経験によると、アプリケーションの 25% くらいは「何もしなくても」
うまく構築できます。50% かそこらは、ちょっとしたことから大変な苦労まで
の違いはありますが「何とか」構築できます。ということは、頑張っても
インストールできないようなパッケージがかなりあるということです。
それでももしかすると
Sunsite
や
TSX-11 アーカイブ
で ELF
や a.out
のバイナリが見つかるかもしれません。
Red Hat や
Debian
には、Linux でよく使われるソフトウェアのパッケージ化済みのバイナリを大
量にアーカイブしています。もしかすると、ソフトウェアの作者がちょうどあ
なたのマシンで使えるようなコンパイル済みのバイナリを用意しているかもし
れません。
コンパイル済みのバイナリを入手したら、お使いのシステムとの互換性を
確認する必要がある点に注意してください:
バイナリがあなたのハードウェア(例えば Intel x86 系マシン)で
動作するか。
バイナリはお使いのカーネルとの互換性があるか(つまり a.out 形式なのか ELF 形式なのか)。
最新のライブラリを必要とするかどうか。
(rpm や deb)のような適切なユーティリティが必要かどうか。
これ以外の原因でだめだったら、 comp.os.linux.x や comp.os.linux.development といったニュースグループで助けてもらえるかもしれません。
[訳注: 日本語のニュースグループなら fj.os.linux、jlug.ml.users があります。 しかし、これらのニュースグループで答えてくれる人は皆自分の空いた時間を 使ってボランティアで答えてくれています。決してメーカーのサポートでは ないので、失礼な態度を取らないようにしてください。また、質問するときには、 わかりやすく、具体的に質問しましょう。また、問題が解決したなら、解決した ことの報告、解決の要因を忘れずに報告しましょう。]
それでもダメだとしても、少なくとも最善を尽くし、たくさんのことを学んだ のだから、それはそれでいいのではないでしょうか。