0

コンテキスト:これが私の問題なのか、これが実行されているサーバーの問題なのかはわかりません。mysql ライブラリを使用する小さなユーティリティをコンパイルして実行し、cron ジョブにしようとしています。プログラムは次のコマンドで正常にコンパイルされ、エラーや警告は発生しません。

gcc my_program.c -o my_program -I /usr/include/mysql/ -L/usr/include/mysql -lmysqlclient -lglib-2.0 -Wall

追加-lglib-2.0したので...

問題:プログラムを実行しようとすると、次のエラーで中止されます:

./my_program: symbol lookup error: /usr/lib/libmysqlclient.so.15: undefined symbol: strcpy, version GLIBC_2.0

エラーは、実行時に次の行で発生します。

conn = mysql_init(conn);

connとして宣言されていますMYSQL *conn;。これは、mysql.h から何かを使用するのは初めてであり (宣言を除く)、それ自体strcpyを使用すると正常に動作しmy_program.cます。

リンク元のライブラリは次のlibmysqlclient.so.15とおりです。

ldd /usr/lib/libmysqlclient.so.15
    linux-gate.so.1 =>  (0xb7ef6000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7cf4000)
    libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0xb7cc2000)
    libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb7ca9000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7c84000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7c6f000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7b20000)
    /lib/ld-linux.so.2 (0xb7ef7000)

コードでできることはありますか、コンパイルまたはリンク パラメータに何か不足がありますか、それともlibmysqlclient.so.15ライブラリ自体にあるライブラリの動的リンクに問題がありますか? 後者の場合 (mysql ライブラリがサーバーの他の場所で使用されていることを考えると、私はそうは思いません)、サーバーの管理者は問題を解決するために何ができますか?

4

2 に答える 2

1

申し訳ありませんが、問題が見つかりました。実際には、シンボル ルックアップ エラーではなく、セグメンテーション フォールトでした。初期化の代わりに初期化されmysql_initていないものを呼び出したので、故障したに違いなく、C に関する私の限られた知識を超えた理由で、間違ったエラー メッセージが生成されました。connNULLlibmysqlclient

同じ OS の別のビルドを使用して別のシステムでデバッグすると、正しいエラーが生成され、デバッグがはるかに簡単になりました。

于 2010-10-12T12:08:59.963 に答える
1

-rdynamicにフラグを渡してみてくださいgcc

コメント欄をあふれさせるべきではないので:

GLIBC_2.0で定義されているマクロですlibc.so.6。あなたのシステムでlibc.so.6は、GNUのCライブラリの実装です。

libmysqlclient.so.15それでも問題が発生する場合は、 の異なるバージョンに対してビルドされ、libc.so.6異なるシンボルが必要である可能性が非常に高くなります。その場合libmysqlclient.so、ソースから再構築してシステム上のライブラリとリンクするか、プラットフォームで利用可能なアップグレードされたバージョンがあるかどうかを確認する必要があります。

于 2010-10-12T06:30:32.630 に答える