【问题标题】:Undefined reference to MySQL libraries using g++使用 g++ 对 MySQL 库的未定义引用
【发布时间】:2012-04-24 10:08:33
【问题描述】:

我在尝试将我的程序与 5.5 服务器提供的 MySQL 库链接时收到undefined reference to 'mysql_suchandsuch@#' 消息。安装 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 有专门的经验吗?

【问题讨论】:

  • 使用dir /x 这给出了每个文件夹的短名称。这样你就可以得到没有空格的库路径。
  • @Raam 这很有帮助。尽管使用 DOS 多年,但我从未学会过这个技巧……不幸的是,这似乎并没有解决我的库/链接器问题。

标签: c++ mysql path linker g++


【解决方案1】:

您是否尝试过 -lmysql,因为链接器会自动添加 lib 并附加 .lib

【讨论】:

  • 我只是尝试过,没有运气。 (更新问题)
【解决方案2】:

从 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 扩展; the docs are here:

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

如果链接[er] 发现它无法解析的符号,它将尝试 通过寻找另一个不同的定义符号来进行“模糊链接” 仅以符号名称的格式(cdecl vs stdcall)并且将 通过链接到匹配来解析该符号。例如, 未定义的符号 _foo 可能链接到函数 _foo@12,或者 未定义的符号 _bar@16 可能链接到函数 _bar。什么时候 链接器这样做,它会打印一个警告,因为它通常应该 链接失败,但有时会导入从生成的库 第三方 dll 可能需要此功能才能使用。如果您指定 --enable-stdcall-fixup,此功能已完全启用并发出警告 不打印。如果你指定 --disable-stdcall-fixup,这个特性是 禁用,并且此类不匹配被视为错误。 [这个选项 特定于链接器的 i386 PE 目标端口]

【讨论】:

  • 我刚刚尝试过这个:"C:\Progra~1\MySQL\MySQLS~1.5\lib\libmysql.dll" 并得到了以下内容(警告,但至少它链接了!)...Warning: resolving _mysql_init@4 by linking to _mysql_init Use --enable-stdcall-fixup to disable these warnings Use --disable-stdcall-fixup to disable these fixups 对此有什么想法吗?我应该使用其他链接器选项,还是可以继续使用?
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2020-08-13
  • 2016-07-21
相关资源
最近更新 更多