Win7 MInGW QT MySQL程序尖叫“找不到-lqsqlmysqld”;遗失的图书馆在哪里?

时间:2010-08-16 15:52:41

标签: mysql plugins qt4 makefile

我正在尝试在Windows 7上制作一个使用MySQL插件的qt程序。

我使用我的minGW 32位编译器编译了qt和mysql插件没有问题。

但是,我继续收到这样的错误:

mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/Users/dhatt/Desktop/testdb2'
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -    I"..\..\..\..\QT\qt\include\QtCore" -I"..\..\..\..\QT\qt\include\QtGui" -I"..\..\..\..\QT\qt\include\QtSql" -I"..\..\..\..\QT\qt\include" -I"..\..\..\..\MySQL\bin" -I"..\..\..\..\QT\qt\include\ActiveQt" -I"debug" -I"..\..\..\..\QT\qt\mkspecs\win32-g++" -o debug\database.o database.cpp
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\testdb2.exe debug/database.o  -L"c:\QT\qt\lib" -lmingw32 -lqtmaind -L C:\MySQL\lib\opt -LC:/QT/qt/plugins/sqldrivers -lqsqlmysqld -lQtSqld4 -lQtGuid4 -lQtCored4 -LC:\MySQL\lib\opt
C:/qt/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot find -lqsqlmysqld
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\executable.exe] Error 1
mingw32-make[1]: Leaving directory `C:/Users/dhatt/Desktop/testdb2'
mingw32-make: *** [debug] Error 2

我提前道歉是因为我所做的事情非常冗长,但我这样做部分是为了排除故障,部分是因为任何其他失去的灵魂最终都不会在这个特定问题上浪费三周时间。 :)

以下是我的规格:

Windows 7 Nokia's Open Source QT
Qt SDK for Windows (C:\Qt\2010.04\qt)
Linux MinGW Version 5.1.6 (C\Linux\MinGW)
MySQL5 with C++ files (C:\MySQL5)

如果您想知道我如何安装qt,请按照本网站的说明进行操作:

http://www.jiggerjuice.net/software/qt-sql-drivers.html

这些其他网站可能包含一些额外的信息花絮:

http://doc.qt.nokia.com/4.6/sql-driver.html

http://www.rag.com.au/linux/qt4howto.html

http://qtnode.net/wiki?title=Qt4_on_Windows(是的,我确实查过了诺基亚的文档!!!)

http://doc.trolltech.com/qq/qq10-windows-deployment.html

这位老乡提到了重塑qmake,除非我有充分的理由,否则我不会这样做。

http://christopher.rasch-olsen.no/2009/04/14/qt-45-and-mysql-plugin-with-mingw-on-windows-xp/

我之前已经删除了一次插件缓存,希望我不必再这样做了......

http://doc.trolltech.com/4.2/plugins-howto.html#the-plugin-cache

http://ubuntuforums.org/showthread.php?t=1070155

如果在两个编译选项(静态创建mysql库或作为插件)之间存在任何混淆,我选择了插件,因为它编译速度更快,我不必担心许可。

一般来说,对大多数人来说,mysql的大麻烦就是制作一个兼容mingw的库。通常,我使用(https://olex.openlogic.com/packages/mingw-utils)...

中的mingw工具执行此操作
c:\> cd MySQL\lib\opt
c:\mysql\lib\opt> reimp -d libmysql.lib
c:\mysql\lib\opt> dlltool --input-def libmysql.def --dllname libmysql.dll --output-lib libmysql.a -k

我应该这样做,因为在我的C:\ MySQL \ lib \ opt中,它有两个文件:

libmysql.a
libmysql.lib
LIBMYSQL.def   (not a typo)

并且在C:\ MySQL \ bin目录中,我有:

libmySQL.bin    (not a typo)

我之前编译了mysql插件:

cd %QTDIR%\src\plugins\sqldrivers\mysql
qmake "INCLUDEPATH+=C:\MySQL\include" "LIBS+=C:\MYSQL\lib\opt\libmysql.lib" mysql.pro
mingw32-make

结果,我在我的C:\ QT \ qt \ plugins \ sqldrivers文件夹中:

libqsqlmysql4.a
libqsqlmysqldq4.a
libqsqlodbc4.a
libqsqlodbcd4.a
qsqlmysql4.dll
qsqlmysqld4.dll
qsqlodbc4.dll
qsqlodbc4.dll

在我的C:\ QT \ bin文件夹中

QtSql4.dll
QtSqld4.dll

所以,我假设从这个网站(http://www.qtforum.org/article/21352/how-to-compile-use-a-mysql-driver.html)我做对了。

我没有使用qt本身的二进制文件,我使用已编译的qt文件(也来自诺基亚),但使用mingw32-make重新配置并重新编译它们。我没有错。这是我重新设置qt的配置选项。

-opensource
-nomake examples
-nomake demos
-no-sql-lite
-no-qt3support
-no-gif
-no-libpng
-no-libmng
-no-libtiff
-no-phonon
-no-phonon-backend
-no-multimedia
-no-audio-backend
-no-webkit
-no-script
-no-scripttools
-nodeclarative
-plugin-sql-mysql -l mysql -I C:\QT\qt\include -L C:\QT\qt\lib\opt

这是我的.pro文件

LANGUAGE = C++

TEMPLATE = app
TARGET = executable
QT += core sql
QTPLUGIN += qsqlmysql
DEPENDPATH += .
INCLUDEPATH += C:\MySQL\bin
LIBS += -L C:\MySQL\lib\opt -lmysql

# Input
SOURCES += database.cpp

我安装了这里描述的插件:

C:\QT\qt

我的路径变量是:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Python26;C:\Linux\Cygwin\bin;C:\mingw-utils-0.3\bin;C:\QT\qt\bin;C:\MySQL\bin;C:\MySQL\include;C:\QT\mingw32\bin;C:\QT\mingw\bin;C:\QT\qt\plugins\sqldrivers

qt命令提示符添加了一些额外的内容,所以我在命令提示符下完成了所有这些操作。

Setting up a MinGW/Qt only environment...
-- QTDIR set to C:\QT\qt
-- PATH set to C:\QT\qt\bin
-- Adding C:\QT\bin to PATH
-- Adding C:\Windows\System32 to PATH
-- QMAKESPEC set to win32-g++ (mingw is my only compiler so, this is unnecessary)

虽然我已经做了所有这些,或者它是多余的。我只是为了完整起见而加上这个。

这是我的代码(database.cpp):

#include <QtSql>
#include <iostream>
using namespace std;

int main( int argc, char ** argv )
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("---.---.---.---");
    db.setDatabaseName("--------");
    db.setUserName("------------");
    db.setPassword("------------");
    if (!db.open()) cout << "Failed to connect to mysql" << endl;
    else cout << "Works finally." << endl;
    QSqlDatabase::removeDatabase("QMYSQL");
    exit ( 0 );
}

很简单,是吗?

我使用示例代码访问了我的目录,运行

mingw32-make distclean
qmake
mingw32-make

并获取上面的错误消息。我已经尝试仅使用发布版本构建版本(没有调试),它仍然显示相同的消息,但是“找不到-lqsqlmysq”,所以它不是那样。

我尝试了很多东西,但我应该在哪里寻找解决方案;也许有人可以为我缩小范围,让我走上正确的道路,甚至更好,解决他烦人的问题。

另外,我打算在我的代码中使用python绑定(我需要PyQT + MySQL)。如果建议的解决方案阻止我这样做,请告诉我。

1 个答案:

答案 0 :(得分:2)

嗯,我将再次解决我自己的问题,所以让我们开心吧!

这是你的最后一次机会。

在此之后,没有回头。

您下载PyQT.exe,故事结束。你在床上醒来,你相信任何你想要相信的东西。你修改.pro文件,你留在仙境。而且,我告诉你兔子洞有多深。

我最终放弃并下载了.exe,它开箱即用MySQL支持。如果mysql不起作用,你的应用程序就出问题了,我建议你在这里阅读这篇文章(http://lists.trolltech.com/qt-interest/2006-06/thread00292-0.html)或者按照下面的引用:

  

问题是你要么必须这样做   使用addLibraryPath方法或
  创建一个QCoreApplication实例   在你第一次打电话加载之前   数据库

相信我,在Windows上手动安装PyQT + MySQL是一件痛苦的事。但是如果你需要一些插件来解决可执行文件不知道的问题,你必须进一步深入兔子洞。

以下是新的和改进的.pro文件:

LANGUAGE = C++

TEMPLATE = app
TARGET = executable
QT += core sql
QTPLUGIN += qsqlmysql
DEPENDPATH += .
INCLUDEPATH += C:\MySQL\bin
LIBS += -L C:\MySQL\lib\opt

# Input
SOURCES += database.cpp

原来我确实有正确的mysql路径,我只是把它与我的.pro文件混淆了。重新加载qt并再次执行上述步骤后,修改我的.pro文件就完全不同了。

但现在我不得不下载SIP和PyQT。我跟着那里的文档。还有一些问题。如果信息被删除,请按照那里留下的链接或说明进行操作。

如果您的SIP make install在查看Unix路径(/ usr / bin)而不是DOS路径(C:\ QT)时出错,请查看此链接http://old.nabble.com/Building-SIP-on-MinGW-:-problem-at-%22make-install%22-td28909249.html# (简短版本:问题是你的其他一个linux编译器中的sh.exe如cygwin或msys,暂时更改名称以强制make install使用DOS路径命名):

如果您配置PyQT并且它吐出与QTCore

有关的文件错误

谷歌pexports和下载。转到%QTdir%/ bin。然后按照说明或链接(http://jeethurao.com/blog/?p=18

pexports QtCore4.dll > QtCore4.def
dlltool –dllname QtCore4.dll –def QtCore4.def –output-lib libQtCore4.a
move libQtCore4.a ..\lib

现在你知道功夫了。

P.S:我自己从未尝试过这种方法。这是一个不同但未经测试的(由我编译)编译PyQT的方法,由Trolltech的巨魔完成: http://www.diotavelli.net/PyQtWiki/InstallingPyQTCommercialWin

相关问题