2012-04-12 70 views
6

想我的程序与5.5服务器所提供的MySQL的库链接时,我得到的消息undefined reference to '[email protected]#' MySQL的库。在安装MySQL时,我使用了默认路径,这在Windows上对我来说是C:\Program Files\MySQL\MySQL Server 5.5\。最初,我曾认为这些空间正在引起我的悲伤,但我想我已经正确地计算出了如何指向没有空格的库路径(仍然没有运气)。如果还有其他可能的原因,请告诉我。未定义参考使用G ++

我已审查了一系列关于这个网站试图解决我的问题的问题...

使用的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

使用'dir/x'可以给出每个文件夹的短名称。这样你就可以在没有任何空格的情况下获得图书馆的路径。 – Raam 2012-04-12 04:34:19

+0

@Raam这很有帮助。尽管多年来使用DOS,但我从来没有学过这个技巧......不幸的是,这似乎并没有解决我的库/链接器问题。 – Gaffi 2012-04-12 10:53:52

回答

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目标端口]

+0

我只是试着用这个:'“C:\ Progra〜1 \ MySQL \ MySQLS〜1.5 \ lib \ libmysql.dll”,并得到了以下内容(警告,但至少它链接! 。警告:通过链接到_mysql_init来解析_mysql_init @ 4 使用--enable-stdcall-fixup来禁用这些警告 使用--disable-stdcall-fixup来禁用这些fixup'对此有任何想法?我应该使用另一个链接器选项,还是我很好走? – Gaffi 2012-04-13 23:43:57

+0

@Gaffi - 查看我的答案更新。 – Lumi 2012-04-14 09:04:08

0

,您是否试图-lmysql作为接头自动会预先lib并追加.lib

+0

我只是尝试,没有运气。 (更新问题) – Gaffi 2012-04-12 22:22:14