Solved issues with building QMYSQL plugin
-
@jsulm here's the project file. I put in the last line myself.
TARGET = qsqlmysql HEADERS += $$PWD/qsql_mysql_p.h SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp #QMAKE_USE += mysql OTHER_FILES += mysql.json PLUGIN_CLASS_NAME = QMYSQLDriverPlugin include(../qsqldriverbase.pri) QMAKE_CXXFLAGS -= "-std=c++1z"
I'm still getting this error, though:
/opt/Qt/5.8/Src/qtbase/mkspecs/features/qt_plugin.prf:62: error: Cannot touch /mkspecs/modules/qt_plugin_qsqlmysql.pri: Operation not permitted.
It's trying to write to mkspecs as a root directory. I verified this by running as root; it creates a mkspecs root directory. I think the cause is some undefined symbols, as the lines that form this symbol are:
38 mod_work_pfx = $$MODULE_QMAKE_OUTDIR/mkspecs/modules 44 MODULE_FWD_PRI = $$mod_work_pfx/qt_plugin_$${MODULE}.pri 62 touch($$MODULE_FWD_PRI, $$MODULE_PRI)
Thanks for any assistance.
-
To avoid losing time, just copy the qtbase module sources in you home folder so you don't have that touch problem.
-
I just tried this; got a few errors. I took care of all but one:
error: Project has no top-level .qmake.conf file.
I still think there's something wrong with my variables or symbols if it was trying to write to the root directory, though.
-
Did you copy the whole qtbase source ?
-
@SGaist oops...I misread what you said above...sorry. I'm still getting this error, though:
/home/mzimmers/QtStuff/qtbase/mkspecs/features/qt_plugin.prf:62: error: Cannot touch /mkspecs/modules/qt_plugin_qsqlmysql.pri: Operation not permitted.
I can try this with root, too, but I'm pretty sure it will indeed write to a directory /mkspecs...it did before.
-
The sources likely have kept their rights. You should call something like
sudo chown user:group qtbase -R
(replace user and group by your user name and main group). -
User and group IDs are already mine. (They are in the original location as well.)
-
Then are the files read-only ?
-
@SGaist No, not for me:
mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$ pwd /home/mzimmers/QtStuff/qtbase/src/plugins/sqldrivers/mysql mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$ ls -l total 108 -rw-rw-r-- 1 mzimmers mzimmers 2619 Jan 18 09:20 main.cpp -rw-r--r-- 1 mzimmers mzimmers 8229 Mar 15 20:04 Makefile -rw-rw-r-- 1 mzimmers mzimmers 40 Jan 18 09:20 mysql.json -rw-rw-r-- 1 mzimmers mzimmers 250 Mar 15 20:06 mysql.pro -rw-r--r-- 1 mzimmers mzimmers 23807 Mar 16 17:11 mysql.pro.user -rw-rw-r-- 1 mzimmers mzimmers 50811 Jan 18 09:20 qsql_mysql.cpp -rw-rw-r-- 1 mzimmers mzimmers 3952 Jan 18 09:20 qsql_mysql_p.h -rw-rw-r-- 1 mzimmers mzimmers 204 Jan 18 09:20 README mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$
-
I just realised there's something fishy with the error message: the path seems to start at the root of the filesystem and doesn't match anything I know from the sources.
Can you try a clean out of source build of the plugin from the console ?
-
@SGaist I deleted my Makefile and ran the following command:
mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$ /opt/Qt/5.8/gcc_64/bin/qmake "INCLUDEPATH+=/usr/local/include /usr/src/mysql/mysql-5.7.17/include" "LIBS+=-L/usr/lib -lmysqlclient_r" /home/mzimmers/QtStuff/qtbase/src/plugins/sqldrivers/mysql/mysql.pro
Question #1: what is the correct syntax for removing a compiler flag? I tried this:
QMAKE_CXXFLAGS -= "-std=c++1z"
but that didn't work.
I then went in and manually modified the Makefile, changing "-std=c++1z" to "-std=c++11", and ran make. I then encountered this error:
mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$ make g++ -c -pipe -O2 -std=c++11 -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -D_REENTRANT -fPIC -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I. -isystem /usr/local/include -I/usr/src/mysql/mysql-5.7.17/include -I/opt/Qt/5.8/gcc_64/include/QtSql/5.8.0 -I/opt/Qt/5.8/gcc_64/include/QtSql/5.8.0/QtSql -I/opt/Qt/5.8/gcc_64/include/QtCore/5.8.0 -I/opt/Qt/5.8/gcc_64/include/QtCore/5.8.0/QtCore -I/opt/Qt/5.8/gcc_64/include -I/opt/Qt/5.8/gcc_64/include/QtSql -I/opt/Qt/5.8/gcc_64/include/QtCore -I.moc -I../../../../mkspecs/linux-g++ -o .obj/qsql_mysql.o qsql_mysql.cpp In file included from qsql_mysql_p.h:60:0, from qsql_mysql.cpp:40: /usr/src/mysql/mysql-5.7.17/include/mysql.h:57:27: fatal error: mysql_version.h: No such file or directory #include "mysql_version.h" ^ compilation terminated. Makefile:834: recipe for target '.obj/qsql_mysql.o' failed make: *** [.obj/qsql_mysql.o] Error 1 mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$
I don't have a file named mysql_version.h. I do have a file named mysql_version.h.in. I'm not familiar with .in files, but according to Wiki, it's input to a program called "autoconf." In reading the documentation, I wonder whether I somehow missed a step in the build that converts this .in file into a .h file. EDIT: I did find a cmake file with that name as well, though there's nothing in the documentation about running cmake manually.
Anyway, we do seem to be moving forward. I would like to resolve this problem with the compiler flag, though.
Thanks for all the help.
-
Out of curiosity, why don't you install the MySQL dev package from your distribution ? That would certainly simplify things.
As for your compiler, which version is it ?
-
MySQL doesn't make a package for Debian. The compiler is 4.9.2. I asked about updating the compiler in a Debian forum, and got a lot of snarky answers telling me it was a bad idea.
-
Sure there is: see libmysqlclient-dev.
IIRC 4.9.2 should be good to build Qt 5.
-
@SGaist I'm sorry; I misunderstood you -- when you said "from your distribution," I thought you meant part of the Debian package.
Just to be clear, are you saying that with that package, I can better build the QMYSQL plugin, or that it's already included?
And, for my education, I'd really like to know how to alter compiler flags on the command line. I've tried "QMAKE_CXXFLAGS -=" but that doesn't seem to do anything.
Thanks.
-
It will make things easier to build the plugin.
IIRC
CONFIG += c++11
should only enable C++11 feature and not later. -
@SGaist I think we're getting closer. I installed the package you referenced above, and ran this qmake command:
/opt/Qt/5.8/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include" "LIBS+=-L/usr/lib/x86_64-linux-gnu/ -lmysqlclient_r" /home/mzimmers/QtStuff/qtbase/src/plugins/sqldrivers/mysql/mysql.pro/
I then edited the Makefile, changing the 2 occurrences of "-std=c++1z" to "-std=c++11" and ran make. Here's the output:
mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$ make rm -f libqsqlmysql.so g++ -Wl,--no-undefined -Wl,-O1 -Wl,--enable-new-dtags -Wl,-z,origin -Wl,-rpath,\$ORIGIN/../../lib -Wl,-rpath,\$ORIGIN/../../lib -shared -o libqsqlmysql.so .obj/qsql_mysql.o .obj/main.o .obj/moc_qsql_mysql_p.o -L/usr/lib -lmysqlclient_r -L/opt/Qt/5.8/gcc_64/lib -lQt5Sql -lQt5Core -L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -lssl -lcrypto -ldl /usr/bin/ld: cannot find -lmysqlclient_r collect2: error: ld returned 1 exit status Makefile:115: recipe for target '../../../../plugins/sqldrivers/libqsqlmysql.so' failed make: *** [../../../../plugins/sqldrivers/libqsqlmysql.so] Error 1 mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$
I also tried LIBS+=-L/usr/lib/x86_64-linux-gnu (which is the actual directory) with the same results. Any idea what's wrong here?
Thank you.
-
You shouldn't need the -l parameter
-
@SGaist OK, I removed it. Here are the results:
mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$ /opt/Qt/5.8/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include" "LIBS+=-L/usr/lib/" ./mysql.pro mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$ make rm -f libqsqlmysql.so g++ -Wl,--no-undefined -Wl,-O1 -Wl,--enable-new-dtags -Wl,-z,origin -Wl,-rpath,\$ORIGIN/../../lib -Wl,-rpath,\$ORIGIN/../../lib -shared -o libqsqlmysql.so .obj/qsql_mysql.o .obj/main.o .obj/moc_qsql_mysql_p.o -L/usr/lib/ -L/opt/Qt/5.8/gcc_64/lib -lQt5Sql -lQt5Core -L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -lssl -lcrypto -ldl /usr/bin/ld: cannot find -lz /usr/bin/ld: cannot find -lssl /usr/bin/ld: cannot find -lcrypto collect2: error: ld returned 1 exit status Makefile:115: recipe for target '../../../../plugins/sqldrivers/libqsqlmysql.so' failed make: *** [../../../../plugins/sqldrivers/libqsqlmysql.so] Error 1 mzimmers@debian:~/QtStuff/qtbase/src/plugins/sqldrivers/mysql$
I don't know whether this is progress or a step back. Do I need to specify paths for the libraries that make can't find?
On a more general note: I notice that I seem to be needing to do a lot of things that aren't mentioned on the page that talks about building this plugin. Is the page incomplete, or is there something atypical about my Qt installation?
Thanks.
-
You need the development packages for OpenSSL and zlib.
That's rather a side effect of the dependencies of the 3rd party that can change over time.