6

undefined reference to 'mysql_suchandsuch@#'のプログラムを 5.5 サーバーで提供される MySQL ライブラリにリンクしようとすると、メッセージが表示されます。MySQL をインストールしたとき、デフォルトのパスを使用しました。これは、Windows ではC:\Program Files\MySQL\MySQL Server 5.5\. もともと、私はスペースが私の悲しみを引き起こしていると思っていましたが、スペースなしでライブラリ パスを指す方法を正しく考え出したと思います (まだ運がありません)。他に考えられる原因があれば教えてください。

問題を解決するために、このサイトの一連の質問を確認しました...

mingw/g++ を使用して、私自身の調査とここでの提案に基づいて、次のオプションを使用してリンクを試みました。

  • -L"C:\Program Files\MySQL\MySQL Server 5.5\lib\" -llibmysql.lib
  • -L"C:\Program Files\MySQL\MySQL Server 5.5\lib\" -lmysqlclient.lib
  • -L"C:\Progra~1\MySQL\MySQLS~1.5\lib\" -llibmysql.lib
  • -LC:\Progra~1\MySQL\MySQLS~1.5\lib\ -lmysqlclient.lib
  • -L"C:\Progra~1\MySQL\MySQLS~1.5\lib\" -lmysql

すべての場合において、-L/-lオプションはステートメントの右端に置きました。これが問題になる可能性があることは理解しています。

ライブラリが存在することを確認しました。/lib ディレクトリには、libmysql.lib、mysqlclient.lib、および libmysql.dll があります。私がレビューしたチュートリアル/フォーラムでそれが示唆されていなかったため、.dll とのリンクは試みていません。

私はMAKEFILESを使用していません。

g++/MySQL の特定の経験がある人はいますか?

4

2 に答える 2

1

次のコマンドは、2011 年 11 月の GCC 4.6.1 を使用して問題なく動作します。

g++ my.cpp -I D:\Opt\MySQL5.5\include ^
  D:\Opt\MySQL5.5\lib\libmysql.dll -o myWithDll.exe

g++ my.cpp -I D:\Opt\MySQL5.5\include ^
  -L D:\Opt\MySQL5.5\lib -lmysql -o myWithLib.exe

したがって、LIB と DLL の両方に対するリンクは機能します。

警告が表示される場合があります (Gaffi のコメントを参照)。これは、ユーザーが指定しなくてもリンカーがファジー リンクを実行するためです。通常、リンクに失敗します。しかし、それは素晴らしいことであり、あなたのためにそれを機能させると同時に、あなたが要求していないのに起こっていることについてあなたに警告します. 警告を抑制する方法は、あいまいリンクを明示的にすることです。

g++ -Wl,--enable-stdcall-fixup my.cpp -I D:\Opt\MySQL5.5\include ^
  D:\Opt\MySQL5.5\lib\libmysql.dll -o myWithDll.exe

g++ -Wl,--enable-stdcall-fixup my.cpp -I D:\Opt\MySQL5.5\include ^
  -L D:\Opt\MySQL5.5\lib -lmysql -o myWithLib.exe

これは、リンカに対する Cygwin/RedHat/MinGW 拡張です。ドキュメントはここにあります

--enable-stdcall-fixup
--disable-stdcall-fixup

link[er] が解決できないシンボルを見つけた場合、シンボル名の形式 (cdecl と stdcall) のみが異なる別の定義済みシンボルを探すことによって「あいまいリンク」を試み、そのシンボルを次の方法で解決します。試合につなげます。たとえば、未定義のシンボル _foo が関数 _foo@12 にリンクされているか、未定義のシンボル _bar@16 が関数 _bar にリンクされている可能性があります。リンカーがこれを行うと、通常はリンクに失敗するはずなので、警告を出力しますが、サードパーティの dll から生成されたインポート ライブラリでは、この機能を使用できるようにする必要がある場合があります。--enable-stdcall-fixup を指定すると、この機能は完全に有効になり、警告は出力されません。--disable-stdcall-fixup を指定すると、この機能は無効になり、そのような不一致はエラーと見なされます。

于 2012-04-13T19:20:27.223 に答える
0

-lmysqlリンカーが自動的に先頭libと末尾に追加するので試しましたか.lib

于 2012-04-12T21:06:04.663 に答える