Win7 MInGW QT Программа MySQL кричит "не могу найти -lqsqlmysqld"; где пропавшая библиотека? - PullRequest
1 голос
/ 16 августа 2010

Я пытаюсь создать программу qt в Windows 7, которая использует плагин MySQL.

Я без проблем скомпилировал qt и плагин mysql, используя мой 32-битный компилятор minGW.

Однако я продолжаю получать ошибку, подобную этой:

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 (да, я проверил документы Nokia!)

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

Этот парень упомянул о переделке qmake, которой я не буду заниматься, если у меня нет веской причины.

http://christopher.rasch -olsen.no / 2009/04/14 / кварты-45-и-MySQL-плагин-с-MinGW-на-Windows-XP /

Я уже однажды удалил кеш плагинов, надеюсь, мне больше не придется это делать ...

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

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

Если есть какая-то путаница, между двумя вариантами компиляции (создание библиотек mysql статически или в качестве плагина), я выбрал плагин, потому что он компилируется быстрее и мне не нужно беспокоиться о лицензировании.

Как правило, большая проблема mysql для большинства людей заключается в создании библиотеки, совместимой с mingw. Обычно я делал это с помощью инструментов mingw в (https://olex.openlogic.com/packages/mingw-utils) ...

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 (также от Nokia), но перенастроил и перекомпилировал их, используя 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 Ответ

2 голосов
/ 19 августа 2010

Ну, я собираюсь решить свою собственную проблему, снова, так что давайте сделаем это забавным!

Это ваш последний шанс.

После этого пути назад нет.

Вы скачиваете PyQT.exe , история заканчивается.Ты просыпаешься в своей постели и веришь всему, чему хочешь верить.Вы изменяете файл .pro, вы остаетесь в стране чудес.И я покажу вам, как глубоко заходит кроличья нора.

В конце концов я сдался и скачал .exe, который имеет поддержку MySQL из коробки.Если mysql не работает, проблема в вашем приложении, и я рекомендую вам прочитать этот пост здесь (http://lists.trolltech.com/qt-interest/2006-06/thread00292-0.html) или следовать приведенной ниже цитате:

Проблема в том, что у вас либо естьиспользовать метод addLibraryPath или
создать экземпляр QCoreApplication перед вашим первым вызовом для загрузки базы данных

Поверьте, установка PyQT + MySQL в Windows вручную - это боль.Но если вам нужен какой-то плагин, чтобы не знать, что исполняемый файл не знает, вам нужно пойти дальше по кроличьей норе.

Вот новый улучшенный файл .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 произошла ошибка, когда он смотрит на пути Unix (/ usr / bin) вместо путей DOS (C: \ QT), посмотрите по этой ссылке http://old.nabble.com/Building-SIP-on-MinGW-:-problem-at-%22make-install%22-td28909249.html# (короткая версия: проблема в том, что sh.exe в одном из ваших других компиляторов linux, таких как cygwin или msys, временно измените имя, чтобы заставить make install использовать DOSимя пути):

Если вы настраиваете PyQT и он выдает ошибку файла, связанную с QTCore

Google 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

И теперь вы знаете кунг-фу.

PS: я никогда не пробовал этот метод сам.Это другой, но не проверенный (мной) метод компиляции PyQT, разработанный троллями в Trolltech: http://www.diotavelli.net/PyQtWiki/InstallingPyQTCommercialWin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...