使用g ++对MySQL库的未定义引用

时间:2012-04-12 04:00:33

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

尝试将程序与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有特定的经验?

2 个答案:

答案 0 :(得分: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扩展; 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目标端口]

答案 1 :(得分:0)

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