次のページ 前のページ 目次へ

7. トラブルシューティング

xmkmfmake がエラーを出さずに正常終了したら、 <@@ref>finalsteps次の節に進んでください。 しかし「実際」には一発でうまく行くことはほとんどありません。 ここで、あなたの知恵が問われるのです。

7.1 リンクエラー

  • xmkmf を実行していたのに 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'
    
    この問題を解決するには、MakefileLIBLIBS-lm を加えて、明示的に計算ライブラリ にリンクさせてください(前の例を参照してください)。

  • xmkmf が失敗するときには、下記のスクリプト を実行してみるのもいいでしょう。
             make -DUseInstalled -I/usr/X386/lib/X11/config
    
    これは、機能をそぎ落として骨と皮だけにした xmkmf と同じ働きを します。

  • ごく稀にですが、root になって ldconfig を実行 すると問題が解決することがあります:
    
    
    # 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 が必要かもしれません。

  • たまに、ソースコードを構築するのに古い X11R5 のライブラリが必要 なことがあります。もし、/usr/X11R6/lib の中に R5 のライブラリがある (最初に Linux をインストールするときにオプションとしてインストール するかどうか聞かれます)場合には、ソフトウェアの構築に必要なライブラリ にリンクを張るだけで大丈夫です。R5 のライブラリの名前は、 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 を使います。

  • パッケージによっては一つまたは複数のライブラリを更新する必要があるでしょ う。例えば、StarDivision 社の StarOffice というオフィススイート のバージョン 4.x は、バージョン 5.4.4 以上の libc が必要なこ とで悪評が高かったです。もっと新しい StarOffice 5.0 でさえ、 新しい glibc 2.1 ライブラリのシステムにインストールすると動作 しません。幸いなことに、さらに新しい StarOffice 5.1 では、こ ういった問題は解決しています。古いバージョンの StarOffice を 使っているなら、root になって、いくつかのライブラリを適切な ディレクトリにコピーし、古いライブラリを削除し、それから シンボリックリンクを再設定する必要があるでしょう(この作業に関する詳し い情報については、StarOffice miniHOWTO の最新版を見てください)。 注意: もし、失敗するとシステムが動作しなくなってしまうので、この作 業は十分注意して行ってください。 通常、最新のライブラリは Sunsite で入手できます。

7.2 その他の問題

  • Perl やシェルスクリプトがインストールされているのに 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 を実行して、適切な ディレクトリへシンボリックリンクを張ってください。

  • X11 のソフトウェアの中には、構築するのに Motif のライブラリが必 要なものがあります。普通の Linux ディストリビューションには Motif の ライブラリは入っておらず、現在は Motif を使うには別途 $100〜$200 のお金を出さなければなりません(ただし、フリーウェアの Lesstif でも多くの場合は動作します)。あるパッケージを構築するのに Motif が必要 なのに Motif ライブラリがない場合でも、静的にリンクされたバイナリファイル が入手できるかもしれません。静的なリンクとはライブラリルーチンを バイナリ自身の中に組み込んだものです。その結果、バイナリファイルは巨大 になりますが、ライブラリの入っていないシステム上でもバイナリを動かすこ とができます。
    
    
    あるパッケージの構築を行うためにシステムに入っていないライブラリが必要 な場合にはリンクエラーが起こります(undefined reference エラー)。 ライブラリは高価な上に中身が秘密になっているかもしれませんし、何か別の 理由で見つけるのが困難なこともあります。こういった場合には、 静的にリンクしたバイナリをパッケージの作者から入手するか、 Linux のユーザグループから入手するのがもっとも簡単な対処です。

  • configure を実行するとおかしな Makefile、つまり構築しようとし ているパッケージに関係がないように見える Makefile ができることがありま す。これは間違った configure、つまりパス中のどこか別のディレ クトリにある configure が実行されたということです。こんなこと にならないように、configure を実行するときは必ず ./configure という指定で呼び出してください。

  • ほとんどの 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 する必要があります。この設定を行うには root になって から chmod u+s [ファイル名] を実行します。(プログラム の所有者はあらかじめ root にしておかなければならないので注意してくださ い。)こうすることで、ファイルのパーミッションの setuid ビット が立ちます。setuid root しなければならないという問題は、 プログラムがモデムや CD-ROM ドライブのようなシステムのハードウェアに アクセスするときや、とある有名エミュレータのように SVGAlib(SVGA操作 ライブラリ)をコンソールモードから呼び出すときに起こります。 root ならプログラムが動作するけれど一般ユーザだと access denied エラーが起こる場合には、この問題を疑いましょう。

    警告: root に setuid したプログラムはシステムのセキュリティ上 の危険を伴います。root に setuid したプログラムは root 権限で 動作するので、致命的な被害を与える可能性があります。setuid ビットを立 てる前には、可能であればソースコードを読んでて、プログラムが何をするの かを確かめてください。

7.3 改善と最適化

Makefile を調べて、あなたのシステムに最適なオプションが設定さ れているかどうかを確かめるといいでしょう。例えば、-O2 オプション は最高レベルの最適化を行い、-fomit-frame-pointer オプションは 小さいバイナリを作成します(ただし、デバッグはできなくなります)。 自分が何をやっているか分からない場合や、どんな場合であれうまく 構築できることが確かめられる前にはこれらのオプションをいじら ないようにしてください。

7.4 さらなる情報の入手先

私の経験によると、アプリケーションの 25% くらいは「何もしなくても」 うまく構築できます。50% かそこらは、ちょっとしたことから大変な苦労まで の違いはありますが「何とか」構築できます。ということは、頑張っても インストールできないようなパッケージがかなりあるということです。 それでももしかすると SunsiteTSX-11 アーカイブELFa.out のバイナリが見つかるかもしれません。 Red HatDebian には、Linux でよく使われるソフトウェアのパッケージ化済みのバイナリを大 量にアーカイブしています。もしかすると、ソフトウェアの作者がちょうどあ なたのマシンで使えるようなコンパイル済みのバイナリを用意しているかもし れません。

コンパイル済みのバイナリを入手したら、お使いのシステムとの互換性を 確認する必要がある点に注意してください:

  • バイナリがあなたのハードウェア(例えば Intel x86 系マシン)で 動作するか。
  • バイナリはお使いのカーネルとの互換性があるか(つまり a.out 形式なのか ELF 形式なのか)。
  • 最新のライブラリを必要とするかどうか。
  • (rpm や deb)のような適切なユーティリティが必要かどうか。

これ以外の原因でだめだったら、 comp.os.linux.xcomp.os.linux.development といったニュースグループで助けてもらえるかもしれません。

[訳注: 日本語のニュースグループなら fj.os.linux、jlug.ml.users があります。 しかし、これらのニュースグループで答えてくれる人は皆自分の空いた時間を 使ってボランティアで答えてくれています。決してメーカーのサポートでは ないので、失礼な態度を取らないようにしてください。また、質問するときには、 わかりやすく、具体的に質問しましょう。また、問題が解決したなら、解決した ことの報告、解決の要因を忘れずに報告しましょう。]

それでもダメだとしても、少なくとも最善を尽くし、たくさんのことを学んだ のだから、それはそれでいいのではないでしょうか。


次のページ 前のページ 目次へ

[