Due to concerns with some Qt libraries with GPL licenses(most are LGPL available), we removed most unused dependencies on our project. After running windeployqt:
windeployqt.exe --dir setup --compiler-runtime --release --qmldir ..\Qml ..\release\OUREXE.exe
We get following logs:
Direct dependencies: Qt5Core Qt5Gui Qt5Network Qt5Qml Qt5Quick Qt5WebSockets Qt5Widgets Qt5WebEngineCore Qt5WebEngineWidgets Qt53DCore Qt53DRender Qt53DInput Qt53DExtras
All dependencies : Qt5Concurrent Qt5Core Qt5Gamepad Qt5Gui Qt5Network Qt5Positioning Qt5PrintSupport Qt5Qml Qt5Quick Qt5QuickWidgets Qt5WebSockets Qt5Widgets Qt5WinExtras Qt5WebEngineCore Qt5WebEngineWidgets Qt53DCore Qt53DRender Qt53DQuick Qt53DQuickRender Qt53DInput Qt53DAnimation Qt53DExtras Qt5WebChannel
To be deployed : Qt5Concurrent Qt5Core Qt5Gamepad Qt5Gui Qt5Network Qt5Positioning Qt5PrintSupport Qt5Qml Qt5Quick Qt5QuickWidgets Qt5SerialPort Qt5Svg Qt5WebSockets Qt5Widgets Qt5WinExtras Qt5WebEngineCore Qt5WebEngineWidgets Qt53DCore Qt53DRender Qt53DQuick Qt53DQuickRender Qt53DInput Qt53DAnimation Qt53DExtras Qt5WebChannel
As you can see, despite windeployqt being aware of "needed" modules, it seems to deploy all Qt modules, even unused ones.
I am aware it is possible to use "--no-" option to manually exclude modules, but I want windeployqt to automatically detect and add only direct dependencies. Is there a way to limit deployed modules to bare minimum with this program?
Turns out Qt53DQuick is NOT QtQuick 3D module library. Qt 5.12.x does not have QtQuick 3D module, and the dlls are part of the Qt3D module.
Related
I'm configuring a project for a raspberry and i'm facing a linking error that i don't understand.
Context:
Actually, i cross-compiled Qt and everything worked fines.
Now, i'm trying to get opencv working as well to make image-processing in my Qt application.
Instead of cross compiling opencv, I installed it with apt install and synchronized my target sysroot in ~/raspi/sysroot.
To get raspi camera control, I'm using mmal libraries (located on rpi in /opt/vc/lib).
I cross compiled Qt with gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf so qmake is using it as well.
Raspi is running Raspian buster Lite which use a quite old glibc (the reason of using gcc-linaro-7.4.1, recommended in Qt mkspec documentation)
Problem:
When I try to compile a simple main.cpp, linker fail when linking opencv libraries:
~/raspi/sysroot/usr/lib/arm-linux-gnueabihf/libopenmpt.so.0: undefined reference to `std::random_device::_M_getentropy() const#GLIBCXX_3.4.25'
On my raspy, glibc version is
$ strings /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_DEBUG_MESSAGE_LENGTH
Question:
I don't understand How opengl can't make reference to a symbol that it is installed on my raspi for my rapsi?
I tryed to compile this code on the raspi and everything link correctly.
What am i missing?
Annex:
the comand failing
~/Documents/personal/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -mfloat-abi=hard --sysroot=~/raspi/sysroot -Wl,-O1 -Wl,-rpath,/usr/local/qt5pi/lib -Wl,-rpath-link,~/raspi/qt5pi/lib -Wl,-rpath-link,~/raspi/sysroot/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link,~/raspi/sysroot/lib/arm-linux-gnueabihf -o photomata main.o -L~/raspi/sysroot/opt/vc/lib/ -lopencv_core -lopencv_videoio -lopencv_highgui -lraspicam -lmmal -lmmal_core -lmmal_util -lmmal_vc_client -lmmal_components -lvchiq_arm -lvcsm -lcontainers -lvcos -lbcm_host ~/raspi/qt5pi/lib/libQt5MultimediaWidgets.so ~/raspi/qt5pi/lib/libQt5Widgets.so ~/raspi/qt5pi/lib/libQt5Multimedia.so ~/raspi/qt5pi/lib/libQt5Gui.so ~/raspi/qt5pi/lib/libQt5Network.so ~/raspi/qt5pi/lib/libQt5Core.so -L~/raspi/sysroot/usr/lib/arm-linux-gnueabihf -lGLESv2 -lpthread
..................
Thank you for taking the time to read and perhaps help me.
Problem continue at Missing crt1.o/crti.o for cross compilation
On my raspy, glibc version is
Your question has nothing to do with GLIBC. It's about libstdcxx.
I don't understand How opengl can't make reference to a symbol that it is installed
What's installed on your target system doesn't matter. What matters is which libraries you are linking against on your host.
From the GCC ABI table, you can tell that GLIBCXX_3.4.25 is first defined in GCC-8.0.0, and that (or later) is the version of GCC that was used to build libopenmpt.so.0.
However, you are trying to link this library with gcc-7.4.1, and against libstdc++.so.6 that came with it. Since that libstdc++.so.6 doesn't define the needed symbol, your link fails.
You need to either rebuild libopenmpt from source using your 7.4.1 compiler, or upgrade to your compiler to gcc-8.0.0 (or above).
P.S. strings is the wrong way to go about figuring out which versions are defined in a library. Use readelf -V instead.
So compiler version is in cause, there are two options:
Recompile opencv with gcc-linaro-7.4.1
Use a >8.0.0 compiler
i've create a new issue at:
Missing crt1.o/crti.o for cross compilation
I'm trying to deploy a program I made so I can send the exe to my teacher.
At first, I couldn't make the exe work outside of qt. Thanks to an answer I found here, I put the folder plugins/platform and a bunch of dlls in the release folder where my exe is located and now it works. But I don't want to need all those files, I just want the exe so, I open cmd, I go to the plath of windeploqt.exe and type:
windeployqt.exe C:\Users\pedro\Documents\build-Ejercicio_07-Desktop_Qt_5_14_0_MinGW_32_bit-Release\Ejercicio_07.exe But I always get the same error:
C:\Qt\Qt5.14.0\5.14.0\mingw73_32\bin>windeployqt.exe C:\Users\pedro\Documents\build-Ejercicio_07-Desktop_Qt_5_14_0_MinGW_32_bit-Release\Ejercicio_07.exe
C:\Users\pedro\Documents\build-Ejercicio_07-Desktop_Qt_5_14_0_MinGW_32_bit-Release\Ejercicio_07.exe 32 bit, release executable
Direct dependencies: Qt5Core Qt5Gui Qt5Widgets
All dependencies : Qt5Core Qt5Gui Qt5Widgets
To be deployed : Qt5Core Qt5Gui Qt5Widgets
Unable to find the platform plugin.
C:\Qt\Qt5.14.0\5.14.0\mingw73_32\bin>
How can I get it to work? I've tried lots of answers and none of them worked for me.
I'm trying to build our application using Qt 5.13.0 installed via Conan/Artifactory. We run our own Artifactory server and the Qt version there is self-build (and statically linked) in our CI solution. We use the Conan recipe for Qt written by the bincrafters, slightly modified to apply some patches for known Qt bugs and set some flags for building properly on Android and WebAssembly.
When trying to build the application, the linker fails to find the necessary dependencies for Qt itself because it tries to look them up in the home folder of the user who build the Qt package, not the user who's running the build.
Here's an excerpt from the build log, showing the attempt at linking all previously compiled object files together:
application folder-------v subproject of the application----v-------v dependency of the application, correct user home dir---------v Qt library installed via Conan, correct user home dir-------v dependency of Qt, WRONG user home dir------------v
g++ -Wl,--gc-sections -o ../../fah [--> all the .o files <--] -L../lib -lmodel -lcore [--> more linked libraries and application parts <--] -L/home/kaupes/.conan/data/libsodium/1.0.18/bje/stable/package/d1efe3774eed76670888f919621e7c4e1b52efa9/lib /home/kaupes/.conan/data/qt/5.13.0/bje/stable/package/d6b3f512e1a5607061462f94e3271dc8af3dd516/lib/libQt5Gui.a /home/dev/.conan/data/harfbuzz/2.4.0/bje/stable/package/c68551ae35bf5d62e66263379d58a38416eb84a9/lib/libharfbuzz.a [--> many, many more libraries <--]
g++: error: /home/dev/.conan/data/harfbuzz/2.4.0/bje/stable/package/c68551ae35bf5d62e66263379d58a38416eb84a9/lib/libharfbuzz.a: No such file or directory
many, many more errors...
As you can see, the user running the build is kaupes, but the g++ invocation attempts to look for the dependencies in /home/dev/, the home folder of the CI user who build the Qt Conan package.
Only dependencies of Qt itself have the problem. Dependencies of the application (also installed via Conan) are found at the correct place.
The Qt package has been build in the CI using the following Conan invocation:
conan create --profile .conan/profiles/linux -s compiler=gcc -s compiler.version=9 . fah/stable
Compiler and version are explicitly set because I'm also build for another GCC version. The linux profile file also doesn't do anything interesting (as far as I can see):
include(default)
[settings]
build_type=Release
compiler.libcxx=libstdc++11
[options]
OpenSSL:shared=False
OpenSSL:no_asm=True
OpenSSL:no_asm=True
OpenSSL:no_weak_ssl_ciphers=True
OpenSSL:no_ssl2=True
OpenSSL:no_ssl3=True
OpenSSL:no_engine=True
libcurl:shared=False
libxml2:shared=False
libxml2:fPIC=True
libsodium:shared=False
pcre2:shared=False
libpng:shared=False
freetype:shared=False
bzip2:shared=False
libjpeg:shared=False
harfbuzz:shared=False
xkbcommon:shared=False
qt:shared=False
qt:with_glib=False
qt:with_sqlite3=False
qt:with_mysql=False
qt:with_pq=False
qt:with_odbc=False
qt:with_sdl2=False
qt:with_openal=False
qt:with_libalsa=False
qt:openssl=True
qt:commercial=False
qt:qtsvg=True
qt:qtdeclarative=True
qt:qtactiveqt=False
qt:qtscript=False
qt:qtmultimedia=False
qt:qttools=True
qt:qtxmlpatterns=False
qt:qttranslations=True
qt:qtdoc=False
qt:qtrepotools=False
qt:qtqa=False
qt:qtlocation=True
qt:qtsensors=True
qt:qtwayland=True
qt:qt3d=False
qt:qtimageformats=False
qt:qtgraphicaleffects=True
qt:qtquickcontrols=True
qt:qtserialbus=False
qt:qtserialport=False
qt:qtx11extras=True
qt:qtmacextras=False
qt:qtwinextras=False
qt:qtandroidextras=False
qt:qtwebsockets=True
qt:qtwebchannel=False
qt:qtwebengine=False
qt:qtwebview=False
qt:qtquickcontrols2=True
qt:qtpurchasing=False
qt:qtcharts=True
qt:qtdatavis3d=False
qt:qtvirtualkeyboard=True
qt:qtgamepad=False
qt:qtscxml=False
qt:qtspeech=False
qt:qtnetworkauth=False
qt:qtremoteobjects=False
qt:qtwebglplugin=False
qt:qtlottie=False
qt:qtconnectivity=True
Is there something I'm doing wrong during the Conan package creation or installation or is this caused by something different?
Indeed, when building qt, all paths to dependencies are hardcoded in configurations files (mkspecs\modules\qt_lib_*.pri).
I assume you are building your application with qmake, because you use static qt, and static qt is incompatible with cmake. One thing you could try is to pass the full path to harfbuzz lib to qmake by adding argument QMAKE_LIBS_HARFBUZZ=/home/kaupes/.conan/data/harfbuzz/2.4.0/bje/stable/package/c68551ae35bf5d62e66263379d58a38416eb84a9/lib/libharfbuzz.a to your qmake invocation.
Edit: it seems to be a knwonw behaviour of qt >= 5.12.1 : https://bugreports.qt.io/browse/QTBUG-72903. This feature has been reverted in 5.14.x and 5.15.x with https://github.com/qt/qtbase/commit/9864d2c6f3b628ca9f07a56b197e77bd43931cca
Running:
./myapp -platform wayland
gives:
This application failed to start because it could not find or load the
Qt platform plugin "wayland" in "".
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl,
offscreen, vnc, xcb.
Reinstalling the application may fix this problem. Aborted (core
dumped)
Following the instructions: How to build qtwayland?
Running qmake gives:
Running configuration tests...
Done running configuration tests.
Configure summary:
Qt Wayland Client ........................ no
Qt Wayland Compositor .................... no
Note: No wayland-egl support detected. Cross-toolkit compatibility disabled.
The qtwayland README indicates 2 dependencies:
xkbcommon 0.2.0 - http://xkbcommon.org/
wayland 1.6.0 - http://wayland.freedesktop.org/
On fedora 28, libxkbcommon is installed by default. In addition I also installed libxkbcommon-devel
dnf whatprovides *wayland*
returns no results, although my gnome session is running under wayland.
I see I can download wayland from https://wayland.freedesktop.org/releases.html.
I downloaded and decompressed 1.15, but not sure what to do with decompressed source: do I build it? do I need to put it somewhere where qtwayland can find it?
I see that the following file exists by default in fedora 28:
/usr/lib64/qt5/plugins/wayland-graphics-integration-server/libwayland-egl.so
But copying it to ~/Qt/5.10.1/gcc_64/plugins/platforms
does not resolve my application startup errors.
Question: how to get my Qt application to run under wayland?
Added in response to bobbaluba questions below:
Am trying to build QtWayland against the official Qt Binaries because it is not included.
Installed wayland-devel as suggested, but qmake still reported no configure for Qt Wayland Client, as per the message above.
Tried to install qt5-qtwayland using dnf, which reported:
Package qt5-qtwayland-5.10.1-2.fc28.x86_64 is already installed, skipping.
The following might be relevant:
? sudo dnf whatprovides libwayland-egl.so
Last metadata expiration check: 0:18:44 ago on Wed 09 May 2018 09:15:20 PM +08.
qt5-qtwayland-5.10.1-2.fc28.i686 : Qt5 - Wayland platform support and QtCompositor module
Repo : fedora
Matched from:
Provide : libwayland-egl.so
? find / -name libwayland-egl.so* -print
/usr/lib64/libwayland-egl.so
/usr/lib64/qt5/plugins/wayland-graphics-integration-server/libwayland-egl.so
? sudo ldconfig -p | grep wayland-egl
libwayland-egl.so.1 (libc6,x86-64) => /lib64/libwayland-egl.so.1
libwayland-egl.so (libc6,x86-64) => /lib64/libwayland-egl.so
Installed Qt 5.11.0rc which resulted in
~/Qt/5.11.0/gcc_64/plugins/wayland-graphics-integration-server/libwayland-egl.so
~/Qt/5.11.0/gcc_64/plugins/wayland-graphics-integration-server/libwayland-egl.so.debug
being added to ~/Qt/5.11.0/gcc_64/plugins/platforms.
cmake's CMakeFile.txt suddenly stopped working when I installed Qt5.11rc - with gcc unable to find Qt headers like QDate.
Tried compiling the example project 'addressbook' using Qt5.11 and got:
QSocketNotifier: Can only be used with threads started with QThread
Using Wayland-EGL
Using the 'xdg-shell-v6' shell integration
In short, using the Qt5.11rc seems to resolve the issue.
Why does configuring QtWayland fail?
I'm assuming (correct me if I'm wrong) that you are trying to build QtWayland against official Qt binaries that do not include QtWayland.
Do you have development packages installed? In your case I think it should be wayland-devel.
Btw, the libwayland-egl.so you see, is your distro's version of the qt wayland-egl buffer integration (and not the same as the libwayland-egl.so dependency which qmake complains is missing). However, you should still be able to build QtWayland without wayland-egl, so I'm not sure what this is about.
Other options:
1. Use official QtWayland binaries
You are probably running into this problem because Qt packages did not previously include QtWayland.
However, starting with Qt 5.11.0 the official Qt binaries should include QtWayland, so the easiest thing would probably be to install Qt 5.11.0 or newer.
2. Use the distro's version of Qt (and Qt Wayland)
Install and use Qt from the distro, make sure you also install qtwayland (on Fedora I think it's qt5-qtwayland).
I'm trying to compile a project using cmake. The instructions given to me was that Qt 4.8 is needed. Downloaded it from qt-project.org/downloads. Compiled and installed Qt 4.8:
mazdak#lnxamindai> qmake -query
QT_INSTALL_PREFIX:/usr/local/Trolltech/Qt-4.8.5
QT_INSTALL_DATA:/usr/local/Trolltech/Qt-4.8.5
QT_INSTALL_DOCS:/usr/local/Trolltech/Qt-4.8.5/doc
QT_INSTALL_HEADERS:/usr/local/Trolltech/Qt-4.8.5/include
QT_INSTALL_LIBS:/usr/local/Trolltech/Qt-4.8.5/lib
QT_INSTALL_BINS:/usr/local/Trolltech/Qt-4.8.5/bin
QT_INSTALL_PLUGINS:/usr/local/Trolltech/Qt-4.8.5/plugins
QT_INSTALL_IMPORTS:/usr/local/Trolltech/Qt-4.8.5/imports
QT_INSTALL_TRANSLATIONS:/usr/local/Trolltech/Qt-4.8.5/translations
QT_INSTALL_CONFIGURATION:/etc/xdg
QT_INSTALL_EXAMPLES:/usr/local/Trolltech/Qt-4.8.5/examples
QT_INSTALL_DEMOS:/usr/local/Trolltech/Qt-4.8.5/demos
QMAKE_MKSPECS:/usr/local/Trolltech/Qt-4.8.5/mkspecs
QMAKE_VERSION:2.01a
QT_VERSION:4.8.5
However, when compiling the project I received the following error:
root#lnxamindai> cmake .
-- Setting flags for GNU GCC
-- REQUIRED_VARS (missing: QTMOBILITY_INCLUDE_DIR QTMOBILITY_MULTIMEDIAKIT_INCLUDE_DIR QTMOBILITY_MULTIMEDIAKIT_LIBRARY VERSION_VAR QTMOBILITY_VERSION)
Qt QTOPENGL library not found.
-- Buiding ManyEarsLib Library...
-- Buiding RTAudio Library...
-- Found jack: /usr/lib/libjack.so
ALSA lib : -lasound -lpthread
Qt QTOPENGL library not found.
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
OPENGL_INCLUDE_DIR (ADVANCED)
used as include directory in directory /home/mazdak/dev/ManyEars/manyears/QtGUI
QTMOBILITY_MULTIMEDIAKIT_LIBRARY (ADVANCED)
linked by target "ManyEars" in directory /home/mazdak/dev/ManyEars/manyears/QtGUI
-- Configuring incomplete, errors occurred!
CMakeLists.txt:
(...)
IF (NOT MANYEARS_GUI_DISABLED)
SET(QT_USE_QTNETWORK TRUE)
SET(QT_USE_QTSVG TRUE)
SET(QT_USE_QTXML TRUE)
SET(QT_USE_QTSCRIPT TRUE)
SET(QT_USE_QTOPENGL TRUE)
SET(QT_USE_QTMULTIMEDIA TRUE)
find_package(QtMobility COMPONENTS MultimediaKit)
find_package(Qt4 4.8.0 QUIET)
if (QTMOBILITY_FOUND)
MESSAGE("QT_MOBILITY_INCLUDE_DIR : ${QTMOBILITY_INCLUDE_DIRS} QT_MOBILITY_LIB: ${QTMOBILITY_LIBRARIES}")
ENDIF (QTMOBILITY_FOUND)
if(QT4_FOUND AND (QT_QTMULTIMEDIA_FOUND OR QTMOBILITY_FOUND))
include(${QT_USE_FILE})
else(QT4_FOUND AND (QT_QTMULTIMEDIA_FOUND OR QTMOBILITY_FOUND))
MESSAGE("WARNING : ManyEars GUI will not be compiled because Qt4 not found or obsolete. You need Qt 4.8 or higher.Try using the latest QtSDK from http://qt-project.org")
MESSAGE("DEBUG: QT4_FOUND: ${QT4_FOUND} QT_MULTIMEDIA_FOUND: ${QT_QTMULTIMEDIA_FOUND} QT_MOBILITY_FOUND: ${QTMOBILITY_FOUND}")
SET(MANYEARS_GUI_DISABLED TRUE)
endif(QT4_FOUND AND (QT_QTMULTIMEDIA_FOUND OR QTMOBILITY_FOUND))
ELSE (NOT MANYEARS_GUI_DISABLED)
MESSAGE("ManyEars GUI disabled.")
ENDIF (NOT MANYEARS_GUI_DISABLED)
#Files excluded from package
set(CPACK_SOURCE_IGNORE_FILES
"build"
"bin"
${CPACK_SOURCE_IGNORE_FILES}
".svn"
)
#include files
(...)
IF (UNIX)
#########################################
# Packaging stuff for sources (All UNIX)
#########################################
SET(CPACK_SOURCE_GENERATOR "TGZ")
SET(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING.TXT")
SET(CPACK_PACKAGE_NAME "ManyEars")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "ManyEars")
SET(CPACK_PACKAGE_VENDOR "Francois Grondin, Dominic Letourneau")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.TXT")
SET(CPACK_PACKAGE_CONTACT "blablablabla")
(...)
ENDIF(UNIX)
(...)
INCLUDE(CPack)
This is confusing me, shouldn't the OpenGL library be installed?
This is confusing me, shouldn't the OpenGL library be installed?
It's not complaining about OpenGL. It's complainting about Qt's OpenGL module QtOpenGL which is a different thing. Most likely your custom build of Qt doesn't include the QtOpenGL module. You've to go back building Qt and take extra care that you enable build of the QtOpenGL module.
After some research I found out that I needed to install some development packages if I was compiling from the source code.
apt-get install libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libx11-xcb-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev
When configuring the Qt source code I had forgot to specify that I wanted to install the OpenGL module and the Multimedia Kit. I just naturally ran "configure" without any options and hoped for the best.
./configure --help
Specifies that I needed -multimedia and -opengl.
When I executed configure with the correct options the issue was resolved.
./configure -multimedia -opengl
Note that the multimedia kit needs gstreamer installed.