0

mysql++ ライブラリを使用し、GCC 3.3.4 でコンパイルしていました。
その GCC バージョンにはいくつかのバグがあったため、GCC 3.4.6 にアップグレードしました。
GCC をアップグレードした後、mysql++ を再構築し、プログラムを再コンパイルしました。しかし、今ではセグメンテーション違反エラーが発生します。

次のメッセージが表示されます。

./mysqlTest: 共有オブジェクトのシンボル `_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE' のサイズが異なります。再リンクを検討してください。
セグメンテーション違反

アプリが再び機能するように、再構築、再リンクなどを行う必要があるものはありますか??
mysql C API はどうですか?? mysql++ はそれを包むラッパーです。
mysql C API を再構築する必要がありますか??

助けてください、私は何をすべきかわかりません。私はこれを機能させる必要があります。

4

4 に答える 4

3

C++ 標準ライブラリを GCC 3.3 から GCC 3.4 にアップグレードした後、プログラムがそれらを使用し、同時に標準 C++ ライブラリに対して直接リンクしている場合は、それに対してリンクしているすべてのライブラリを再コンパイルする必要があります。あなたの場合、フォローアップを考慮して、libdb_cxx-4.2 に問題があるため、Berkeley DB 4.2 を再構築します。基本的に、mysqlTest は新しい C++ 標準ライブラリと Berkeley DB の両方に対してリンクしますが、Berkeley DB は古いものに対してリンクします。リンカは両方のライブラリからシンボルを取り込みますが、それらのいくつかのインライン ストレージ クラスがおそらく変更され、Berkeley DB が混乱するでしょう。

使用しているライブラリを確認するにはldd、バイナリに対して実行lddしてから、リスト内の各 C++ ライブラリに対して実行します。

于 2008-10-19T09:34:04.260 に答える
0

moochaへの返信:

私は自分のアプリが使用していた他のいくつかのものを再構築し、動作するように簡単なプログラムを作成することができました。

私はまだ複雑なプログラムでいくつかの問題を抱えていますが、それを解決しようとしています。

少し前にldconfigを実行したときにそのメッセージを見たのを覚えているので、libdb_cxx-4.2.soは問題ではないと確信しています。それでも、どうすればそのエラーメッセージを取り除くことができますか?リンクの問題が頻繁に発生するため、-Lと-lを使用してパラメーターをgccに手動で渡す必要があります。

于 2008-10-19T10:25:43.143 に答える
0

mysql++ を再構築する前に「クリーンアップ」しましたか?

mysqlTest プログラムは再コンパイルされておらず、以前のライブラリが必要なようです。

make clean を実行した場合 (mysqlTest がパッケージに含まれるプログラムであると仮定)、新しいライブラリをインストールした後に 'ldconfig' を実行しましたか?

于 2008-10-19T09:15:52.783 に答える
0

はい、再構築する前に「クリーンアップ」を行いました。
mysqlTest は私のプログラムです。GCC をアップグレードする前にコンパイルしたバージョンがまだあり、正常に動作します。しかし、アップグレード後にコンパイルしたものでは、そのエラーが発生します。

私も ldconfig を実行しましたが、次のメッセージが表示されます。

ldconfig: /usr/lib/libdb_cxx-4.2.so はシンボリック リンクではありません

それが単なる警告なのか、プロセスが中断されたことを意味するのかはわかりません。

于 2008-10-19T09:29:49.200 に答える