みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

borland c++ によるMySQL へのアクセス

borland c++でMySQLデータベースへ接続したいのですが、

外部シンボル 'mysql_real_connect' が未解決
外部シンボル 'mysql_init' が未解決
外部シンボル 'mysql_close' が未解決

というエラーが出てしまいます。

******** 現状 ***********
(1) インクルードしているヘッダファイルは、
  <my_global.h>
  <mysql.h>
  <my_sys.h>
  です。
(2) ソースコードは、
 conn = mysql_init(NULL);
if(mysql_real_connect(conn,opt_host_name,opt_user_name,opt_password,opt_db_name,opt_port_num,opt_socket_name,opt_flags) == NULL)
{
fprintf(stderr,"mysql_real_connect() failed\n");
mysql_close(conn);
exit(1);
}
mysql_close(conn);
exit(0);

といった感じです。

(3) implib を用いて、
  libmySQL.lib から libmySQL.dll へ変換し、
  実行したいソースと同じフォルダに置き、
  リンクしています。

どなたか、ご回答よろしくお願いいたします。

                     

投稿日時 - 2006-02-03 10:06:28

QNo.1940429

暇なときに回答ください

質問者が選んだベストアンサー

まず、libmySQL.lib は本当にプロジェクトに入っていますでしょうか(失礼します。いや、これは時々あるので)

次は、impdef で、dll から .def ファイルを作ってみてください。この .def ファイルは、テキストファイルですので、エディタ等で開けます。
ここで、.dll の中にある関数の一覧が得られます。
この関数の名前が、
'mysql_real_connect' や、'mysql_init' や 'mysql_close' であることを確認してみてください。
関数の名前に、一見意味不明の文字が付いていることがあります。これは、C++のリンケージ規約でコンパイルされた結果です。

この場合、以下の方法を試してみることになります。

1.おそらく、mysql.h の中に、 extern "C" の宣言があると思いますので、一度、この宣言をなくして試してみてください。

2.それでもだめな場合は、他のコンパイラ(Windows 環境なら、Microsoft か、Sygwin なら、Gcc)のC++でコンパイルしてありそうなので、該当のコンパイラを使うということになります。

3.もしも、limmySql.h のなかに、extern "C" がない場合、(これは、リンクエラーの関数名が、Cのリンケージ規約の関数名なので、可能性低いですが)関数プロトタイプの前に、 extern "C" をつけてみてください。

いずれにしても、.def ファイルを眺めると、何かわかるかもしれません。

投稿日時 - 2006-02-03 11:55:11

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

状況は確かに、「リンクに失敗している」ですね。

タイプミスかも知れませんが、implib は、.dll から、.lib を生成するツールです。
もともと、libmySQL.dll があった場合に、これから、libmySQL.lib を生成します。
そして、プロジェクトに、他のソースファイルと一緒に、libmySQL.lib を追加しておきます。

これで、OKのはずですが。

投稿日時 - 2006-02-03 10:19:21

補足

ご回答ありがとうございます。

ご指摘の通り、私のタイプミスでした。

implibでlibmySQL.lib を生成し、
それをリンクしています。
しかし、エラーが出てしまいます。

よろしければ、解決法などご教授ください。

投稿日時 - 2006-02-03 10:53:44

あなたにオススメの質問