新しいビルドマシンをインストールした後、標準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の古いバージョンが利用できないようです。
別のライブラリにリンクする必要はありません。古いバージョンのコンパイラを使用する必要があります。
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から削除します)、掘り下げを開始します。私のために働いた。
必要な共有ライブラリを独自のコード(たとえばサブディレクトリ内)とともに出荷し、アプリケーションを実行する前段階としてLD_LIBRARY_PATHを設定して、最初にそのディレクトリを検索できます。
必要な特定のバージョンを出荷するということは、ユーザーがどのバージョンをインストールしたかは問題ではないことを意味します。すべての依存関係も出荷することを確認する必要があります。
私にとってはうまくいきませんでしたが、他の誰かがそれを役立つと思うかもしれない別の方法は、libgccとlibstdc ++を静的にリンクすることです。
gccにはオプションがあります-static-libgcc
ですが、libstdc ++はまだ動的にリンクされているため、このオプションを使用しても何も達成されません。ただし、gccがlibstdc ++の静的バージョンのみを検出できるようにすることで、静的リンクを実現できます。
ln -s `g++ -print-file-name=libstdc++.a`
g++ -static-libgcc -L. source.cpp
問題は、ブーストライブラリが新しいlibstdc ++に対して構築されているため、プログラムが正しくコンパイルされている間、ランタイムエラーが発生することです...
ブーストを再構築すれば、これは解決できるかもしれませんが、試していません。
(記録のために、たとえばdlopen
を介してライブラリを動的にロードするコードを使用する場合、静的リンクはすべて問題外です)
すでにこれに遭遇しました。配布可能なバイナリを構築するために、ターゲットマシンと同じ構成でシステム(仮想化?)をインストールするよりも良いことは考えていませんでした。
新しいlibstdc ++をクライアントシステムに(プライベートエリアに)「密輸」して、プログラムを適切な-rpath
にリンクするか、古いバージョンのlibstdc ++をコンピューターに取り込むことができます。あなたのようには見えません必要アップデート、そしてとにかく他の理由で問題外かもしれません。
注:FreeBSDでは、libstdc ++はコンパイラーと結合されています(gcc4.2、4.4、4.5がインストールされており、それぞれに独自のlibstc ++があります)。古い(クライアントシステムに一致する)バージョンのgccをインストールしてみてください。これには、探している古いlibstdc ++が含まれている可能性があります。
ソースのリストと一緒に入れてみましたか?これは、実際にライブラリがインストールされていることを前提としています。
g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp
私のために働く:このフラグを設定します:
-Wl、-Bstatic -lstdc ++ -Wl、-Bdynamic -Wl、-Bstatic -lgcc -Wl、-Bdynamic -static
-static-libstdc ++ -staticだけを入力すると、機能しません。