web-dev-qa-db-ja.com

古いバージョンのlibstdc ++とリンクする

新しいビルドマシンをインストールした後、標準C++ライブラリの6.0.10が付属していることがわかりました

-rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10

ただし、ターゲットマシンの多くは、引き続き古いバージョンのlibstdc ++を使用しています。次に例を示します。

-rwxr-xr-x 1 root root  985888 Aug 19 21:14 libstdc++.so.6.0.8

プログラムを実行しようとすると結果として、最後の2つの0.0.1でABIが変更されたようです。

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

古いバージョンのgccを明示的にインストールしようとしましたが、それは役に立ちませんでした。ターゲットマシンのアップグレードは私の手に負えないので、オプションではありません。古いlibstdc ++を搭載したマシンでビルドを機能させるための最良の方法は何ですか?

インストールする古いlibstdc ++バージョンをapt-cacheで検索しましたが、6の古いバージョンが利用できないようです。

28
Pieter

別のライブラリにリンクする必要はありません。古いバージョンのコンパイラを使用する必要があります。

GNU ABIポリシー 。libstdc ++共有ライブラリは上位互換性があるように設計されています。6.0.8が必要な場合はバージョン6.0.10を使用できます。 。ポリシーでは、gcc-4.2.0以降、6.0.9が必要であるため、gcc-4.1.xが必要です。

つまり、システムにlibstdc ++。so.6.0.xが1つしかないのはそのためであり、必要なのは最新のものだけです。

コンパイラの特定のバージョンのみを使用するようにビルドシステムを設定する場合:標準のg ++​​を使用できないことを確認し(リンクの名前を変更し、それを提供するパッケージを削除し、PATHから削除します)、掘り下げを開始します。私のために働いた。

20
Jan

必要な共有ライブラリを独自のコード(たとえばサブディレクトリ内)とともに出荷し、アプリケーションを実行する前段階としてLD_LIBRARY_PATHを設定して、最初にそのディレクトリを検索できます。

必要な特定のバージョンを出荷するということは、ユーザーがどのバージョンをインストールしたかは問題ではないことを意味します。すべての依存関係も出荷することを確認する必要があります。

7
paxdiablo

私にとってはうまくいきませんでしたが、他の誰かがそれを役立つと思うかもしれない別の方法は、libgccとlibstdc ++を静的にリンクすることです。

gccにはオプションがあります-static-libgccですが、libstdc ++はまだ動的にリンクされているため、このオプションを使用しても何も達成されません。ただし、gccがlibstdc ++の静的バージョンのみを検出できるようにすることで、静的リンクを実現できます。

ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp

問題は、ブーストライブラリが新しいlibstdc ++に対して構築されているため、プログラムが正しくコンパイルされている間、ランタイムエラーが発生することです...

ブーストを再構築すれば、これは解決できるかもしれませんが、試していません。

(記録のために、たとえばdlopenを介してライブラリを動的にロードするコードを使用する場合、静的リンクはすべて問題外です)

2
Pieter

すでにこれに遭遇しました。配布可能なバイナリを構築するために、ターゲットマシンと同じ構成でシステム(仮想化?)をインストールするよりも良いことは考えていませんでした。

2
Didier Trosset

新しいlibstdc ++をクライアントシステムに(プライベートエリアに)「密輸」して、プログラムを適切な-rpathにリンクするか、古いバージョンのlibstdc ++をコンピューターに取り込むことができます。あなたのようには見えません必要アップデート、そしてとにかく他の理由で問題外かもしれません。

注:FreeBSDでは、libstdc ++はコンパイラーと結合されています(gcc4.2、4.4、4.5がインストールされており、それぞれに独自のlibstc ++があります)。古い(クライアントシステムに一致する)バージョンのgccをインストールしてみてください。これには、探している古いlibstdc ++が含まれている可能性があります。

1
just somebody

ソースのリストと一緒に入れてみましたか?これは、実際にライブラリがインストールされていることを前提としています。

g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp
0
Tom

私のために働く:このフラグを設定します:

-Wl、-Bstatic -lstdc ++ -Wl、-Bdynamic -Wl、-Bstatic -lgcc -Wl、-Bdynamic -static

-static-libstdc ++ -staticだけを入力すると、機能しません。

0
Rodrigo