gcc 5.1.0をインストールした後、firefox、gnomeなどの多くのプログラムが利用できないことがわかりました。 「GLIBC_2.1X が見つかりません」というメッセージが表示されました。 GLIBC のバージョンが以前より高くなったため、これらのプログラムは使用できません。 gcc 5.1.0をインストールすると、GLIBCがより高いバージョンになるためです。
既存のソフトウェアが正常に動作するようにLinuxを保存してgccを作成するにはどうすればよいですか?
答え1
質問
概して循環依存性の問題がある。私これは私の他の答えからコピーされました。、単に接続するだけではそうならないからです。この問題は、GCC 5.1.0のバイナリバージョンをインストールしたりソースからコンパイルしたときに発生します。 GLIBCには、システム内のすべてのパッケージに必要なシンボルと国際化コードが含まれているため、システム内のすべてのパッケージ(バイナリかどうかにかかわらず)が暗黙的にGLIBCに依存しているため、次の議論が発生します。主な例は次のとおりです。
- 言語エンコーディング
- 通貨記号
- 日付形式
- 計算形式
- 小数点区切り記号の位置
- 区切り文字のタイプ、カンマ10進数など
GCC をアップグレードすると GLIBC がアップグレードされ、GLIBC をアップグレードすると上記のリストなどが中断されます。この問題を解決する唯一の方法は、GCCとGLIBCをアップグレードした後にシステム内のすべてのパッケージを再コンパイルまたは再インストールすることです。ツールチェーン - Ubuntu関連 - バイナリ展開タイプ、そしてツールチェーンの一般的な説明。
ソースコードベースのパッケージをバイナリパッケージベースのシステムと混在させることは、バージョンの不一致が容易に発生する可能性があるため、ほとんど不可能です。以下を考慮してください。
- バイナリパッケージバージョンAは依存関係バージョンBに依存し、依存関係バージョンBでのみ使用できます。依存関係バージョンBはライブラリCを使用します。
- 接続1(バイナリパッケージバージョンA)のロジックも暗黙的にライブラリCに依存しています。
- ライブラリバージョンD(C = 1.0、D = 1.1の場合)で依存関係バージョンBを構築しました。
- 依存関係バージョンBは正常に構築されましたが、バイナリパッケージバージョンAはまだライブラリバージョンCに接続されているため、ライブラリバージョンCのシンボルがバージョンDの最新のシンボルに置き換えられたため、バイナリパッケージAは未確認のシンボルをロードします。
- ライブラリバージョンDがライブラリバージョンCを置き換えたため、開発者は新しいバージョンDをバージョンCにリンクしないことにしました。
- この問題を解決するには、ライブラリバージョンCに接続されているシステムのすべてのパッケージをライブラリバージョンDに再コンパイルする必要があります。
バイナリシステムのすべてのパッケージが事前にパッケージ化されており、ソースでコンパイルすると一部または全部が破損しているため、ここで停止しました。
解決策
パッケージマネージャツールを使用してgcc-5.1.0とGLIBCをダウングレードしてみてください。パッケージマネージャが機能しない場合は、ディストリビューションを逆さまにインストールするよりも再インストールする方が簡単です。
答え2
gcc
コンパイルするためにアップグレードする必要はありませんGLIBC
。私はこれを何度もやってきましたが、通常は新しいバージョンとバージョンが必要binutils
ですgmp
。実際、これらはお互いに関係がありません。私の言葉は、あなたが変わる場合。mpfr
mpc
GLIBC
gcc
gcc
しかし、直接コンパイルしたバージョンをインストールする場合、このシステム全体を使用しないでください。:これは可能で、直接変更できますGLIBC
。代わりにgcc
、自宅で作業バージョンを維持し、ランタイム情報を提供して正しいライブラリにリンクすることができます(調整を通じてLD_LIBRARY_PATH
)。
今はGLIBC
(少なくともある程度)親互換性ではなく、以前のバージョンとの互換性です。GLIBC
アップデートを直接実行しなかった場合は、インストールしたバージョンが最新バージョンを使用していることを意味します。gcc
たとえばGLIBC
、firefox
次のリンクを参照してください。
linux-vdso.so.1 (0x00007fff92d8a000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007ff8a7711000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007ff8a750d000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007ff8a718b000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007ff8a6e87000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff8a6ae5000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff8a792e000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007ff8a68cf000)
これらのほとんどはから提供されていますgcc
(したがって、GLIBC
エラーはfirefox
実際には発生しますgcc
)。
2番目の可能性は更新したことですGLIBC
(インストール方法によっては、gcc
使用しているリポジトリに最新バージョンがあるかのように簡単かもしれません)。GLIBC
この場合は問題になりません。以前のバージョンにコンパイルされたプログラムは、GLIBC
(制限された範囲内で)最新バージョンで動作する必要があります。しかし、いくつかのプログラムは、GLIBC
いくつかの理由で非常に具体的なバージョンを参照し続けます。だからそうかもしれません。
この混乱を復元するには...
外部リポジトリを使用していてパッケージをインストールできる場合は、リポジトリを削除してダウングレードします。
手動でインストールした場合は、gcc
いつでもリポジトリのバージョンを再インストールしてみることができます。しかし、あまり期待しないでください。ディストリビューションを再インストールする必要があります。