1

私は最近、g++4.6とg++4.7の両方を使用してプログラムを開発しています。私は現在、多くのc++11機能を利用しています。

私は、サブディレクトリにプログラムと一緒にライブラリをバンドルしてLD_LIBRARY_PATHを使用できると考えてこの決定を下しました。それ以来、これが私のプログラムのセグメンテーション違反を引き起こしていることを発見しました。私はおそらくこれを少し早くテストするべきだったでしょう。それを引き起こしているのはバンドルされたlibc.so.6のようです(おそらく他のものですが、間違いなくlibcです)。

これまで、libsをインストールできず、正常に機能するこの手法を使用しましたが、プログラムにlibcとlibstdc++を含める必要はありませんでした。

この問題を回避する方法はありますか、それとも古いc ++ / libc / libstdc ++バージョンにロールバックする必要がありますか?(そしてそれに伴うコード変更の悪夢)

4

2 に答える 2

2

依存することは避けLD_LIBRARY_PATHます。テストや開発には使用しますが、本番環境には使用しません。

代わりに、とリンクしてタグを'-Wl,-rpath,$ORIGIN'作成します。これは、ダイナミックリンカが実行可能ファイルと同じディレクトリで共有ライブラリを検索することを意味します(または、たとえば'-Wl、-rpath、$ ORIGIN /../ lib'を使用して検索します)DT_RPATH$ORIGIN../lib

プログラムのいずれかの部分がG++4.7でビルドされている場合は、実行時にGCC4.7のlibstdc++。soを使用する必要があります。

しかし、問題がlibc.so.6にある場合、それはGCCの問題ではなく、私のアドバイスはlibcをバンドルしようとしないことです...システムlibcを置き換えようとすることはおそらく良い考えではありません。

于 2012-11-11T21:41:51.313 に答える
1

g ++ 4.6または4.7だけを使用すると思いますが、両方を使用することはできません。また...ldconfigは、プログラムにlibc.soの/libまたは/usr / libバージョンを実行させようとします。そのため、別のバージョンがある場合、それがどのように機能するかはわかりません。したがって、システムlibcを使用する必要があるかもしれません。

他の誰かが他のアイデアを持っている場合は、それらも投稿してください。

于 2012-10-27T01:13:32.200 に答える