Hey all,
I’m having a difficult time compiling qt5 for android with mysql support. I’ve downloaded the mariadb connector sources, and configured CMake for mariadb to utilize the android toolchain (compiled and installed into API-9 for ARM in this case). However, when I run configure with the following switches:
./configure -prefix /home/rich/local/qt5android -xplatform android-g++ -nomake tests -nomake examples -android-ndk /opt/android-ndk -android-sdk /opt/android-sdk-update-manager -android-ndk-host linux-x86_64 -android-toolchain-version 4.8 -skip qttranslations -skip qtwebkit -skip qtserialport -skip qtwebkit-examples -no-warnings-are-errors -system-proxies -no-cups -plugin-sql-mysql -opensource -confirm-license -developer-build -debug -v
I get errors about missing pthread, rt, and mysqlclient_r libraries:
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ —sysroot=/opt/android-ndk/platforms/android-9/arch-arm/ Wl,-no-undefined -Wl,-z,noexecstack -shared -o mysql_r mysql.o -L/opt/android-ndk/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a -L/opt/android-ndk/platforms/android-9/arch-arm//usr/lib -L/usr/lib64/mysql -lpthread -lz -lm -lrt -lssl -lcrypto -ldl -lmysqlclient_r -lgnustl_shared -llog -lz -lm -ldl -lc -lgcc
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lpthread
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lrt
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: warning: skipping incompatible /usr/lib64/mysql/libmysqlclient_r.so while searching for mysqlclient_r
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lmysqlclient_r
collect2: error: ld returned 1 exit status
gmake: *** [mysql_r] Error 1
MySQL (thread-safe) disabled.
MySQL (thread-unsafe) auto-detection… ()
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ c -Wno-psabi -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -DANDROID -Wa,-noexecstack -std=gnu++0x -O2 -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -Wall -Wno-psabi -W -fPIE -DQT_NO_PRINTER -DQT_NO_PRINTDIALOG -I../../../mkspecs/android-g++ -I. -I/usr/include/mysql -I/opt/android-ndk/sources/cxx-stl/gnu-libstdc++/4.8/include -I/opt/android-ndk/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -I/opt/android-ndk/platforms/android-9/arch-arm/usr/include -o mysql.o mysql.cpp
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ —sysroot=/opt/android-ndk/platforms/android-9/arch-arm/ Wl,-no-undefined -Wl,-z,noexecstack -shared -o mysql mysql.o -L/opt/android-ndk/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a -L/opt/android-ndk/platforms/android-9/arch-arm//usr/lib -L/usr/lib64/mysql -lpthread -lz -lm -lrt -lssl -lcrypto -ldl -lmysqlclient -lgnustl_shared -llog -lz -lm -ldl -lc -lgcc
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lpthread
/opt/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lrt
collect2: error: ld returned 1 exit status
gmake: *** [mysql] Error 1
MySQL (thread-unsafe) disabled.
MySQL support cannot be enabled due to functionality tests!
Here’s the contents of my lib dir under my API 9 sysroot:
ls /opt/android-ndk/platforms/android-9/arch-arm/usr/lib
crtbegin_dynamic.o libcrypto.a libGLESv2.so libmariadb.so.1 libncurses++.a libreadline.so.6 libtinfo.a
crtbegin_so.o libc.so libhistory.a libmenu.a libncurses_g.a libssl.a libtinfo_g.a
crtbegin_static.o libdl.so libhistory.so.6 libmenu_g.a libncurses_p.a libstdc++.a libtinfo_p.a
crtend_android.o libEGL.so libjnigraphics.so libmenu_p.a libOpenSLES.so libstdc++.so libz.so
crtend_so.o libform.a liblog.so libm_hard.a libpanel.a libthread_db.so pkgconfig
engines libform_g.a libm.a libm.so libpanel_g.a libtic.a terminfo
libandroid.so libform_p.a libmariadbclient.a libmysqlclient.a libpanel_p.a libtic_g.a
libc.a libGLESv1_CM.so libmariadb.so libncurses.a libreadline.a libtic_p.a
Note that the ‘libmysqlclient.a’ file is actually a symlink to libmariadbclient.a (IIRC, the API is the exact same, and so all symbols should line up. This does not happen out of the box, I made the symlink manually). Why is the qt5 configure script complaining about these missing libs (especially pthread and rt)?
Also, I was unable to figure out how to generate any “lib*client_r.{a,so}” libraries for mariadb. What can I do to manually tweak what Qt is looking for in its configure script (pthread and rt are built-in and should not be attempting to link), as it’s clearly broken?
It also bugs me that at the tail end of the compile command (where it fails for the first time), the compiler is being passed a “-L/usr/lib64/mysql”, which is the host mysql library folder and not the target mysql library. Why is that being passed in at all?
↧