I needed to port a Windows Qt app to Linux and Mac. Under Mac all is fine but with Ubuntu (tried both 16.04.1 and 14.04 on 2 different machines) the fonts are not antialised. See this picture:
With the dynamic Qt libs all is fine. It only happens when I'm using the Qt static libs. Here's how I'm building Qt statically:
./configure -static -prefix /home/.../Desktop/Qt-4.8.7-static -no-sql-sqlite -no-sql-sqlite2 --platform=linux-g++-32
make
make install
The output above is generated with the standard Qt Widgets template from Qt Creator to which I'm adding:
QMessageBox::information(this, "Horrendous font", "This is one fugly font");
There is no additional code that could be responsible for this. Any idea why this is happening?
Related
After successfully building static QT and my application binary on Linux I moved to Windows to try out the same.
..\qt-everywhere-src-5.12.8\configure.bat -opensource -confirm-license -release -static -static-runtime -no-pch -optimize-size -opengl desktop -platform win32-g++ -prefix "C:\Qt\Static" -skip webengine -nomake tools -nomake tests -nomake examples
mingw32-make -j4 && mingw32-make install
My development environment is Windows 10 x64, MinGW 7.3.0, QT 5.12.8 Static (Built with above cmdline). Now my problem with deployment is:
Strangely the binary is running on a fresh copy of Windows 10, but not on Windows 7. More surprisingly I tried to run the binary on Linux Wine, and voila it worked there as well.
Another problem is related to custom font loading, i.e. QFontDatabase::addApplicationFont also fails on Windows static build. Whereas same code works well on Linux static build or Windows dynamic QT linking. I tried Q_INIT_RESOURCE based on some stackoverflow post but that didn't help.
I tried reading several qt wiki articles but nothing has helped so far for both of the above problems.
Edit #1
Here is the font loading code which is failing on static build:
Q_INIT_RESOURCE(qml);
int idFont = QFontDatabase::addApplicationFont(":/fonts/Comfortaa-Bold.ttf");
if (idFont == -1)
{
qDebug() <<"Failed to load font from resource";
....
Edit #2
There is a new hope. I have just tried building a simple widget application and build that statically with same Qt version. Now it works on fresh Windows 7. So I need to figure out why QML application is not working. Do I need to do anything specific for qml modules or plugin during Qt static build?
Edit #3
Fixed Windows 7 execution issue by changing VM settings.
Fixed the font loading issue by rebuilding Qt. This time I used Qt 5.15.0 and command line was:
configure.bat -opensource -confirm-license -prefix "C:\Qt\5.15.0-Static" -release -static -static-runtime -opengl desktop -platform win32-g++ -make libs -qt-libpng -qt-libjpeg -qt-freetype -qt-zlib -nomake tools -nomake examples -nomake tests -skip qttools
The problem was with VirtualBox display driver which by default doesn't support OpenGL. When I turned on the 3D acceleration in VirtualBox settings the Qt Qml static application worked. This also justifies why my statically linked application worked on Windows 10 as those were installed on direct hardware, not on VM, thus was using proper underlying driver and opengl.
So this implies when you use -opengl desktop flag it uses underlying operating system's opengl library and even though mingw links with -lopenglw32 it still depends on system's opengl.
I installed qt creator and qt 3dstudio with the qtOnline installer for linux. I want to build a project using these two packages. I design my project in qt3dstudio and then I use qtcreator to code the logic of the program. But I cannot import qt3dstudio module into the code.any suggestions??
I need to get this going on ubuntu 16.04LTS. I couldn't find anything useful on the web about the problem. I did try to build qt3dstudio but some of the dependencies caused my ubuntu desktop to stop working and I had to reinstall ubuntu.
QT modules in my .pro file:
QT += widgets qml quick gui 3dstudioruntime2
and when I hit build I get the following error:
Unknown module(s) in QT: 3dstudioruntime2
I have built a static x86 Qt5.5 library with VS2013 using:
configure -static -prefix D:\Qt\qt-5.5.0-x86-static -opensource -release -static-runtime -nomake examples -no-compile-examples -static-runtime -nomake tools -no-iconv -qt-zlib -skip qtwebkit -confirm-license -qmake -opengl desktop -no-angle -nomake tests -target xp
After that I used this static library build a static-link exe of my Qml App. It can run everywhere in my windows which has been installed Qt5.5.
Then I used VMware Workstation to install a pure Windows XP SP3 only installed VC2008 runtime not VC2013 runtime.
Firstly, I copy the exe into this XP. It can run but had nothing to show. I need kill it in taskmgr.
Second, I copy all folders in D:\Qt\qt-5.5.0-x86-static\qml to the root dir of my exe, it can run. But it shows me only a blank window with correct window title.
I think I have listen all the advise in Deploying Qt 5 App on Windows. But why the qml parts cannot be compiled into static library? How can I let my app not show blank?
P.S. Even if I use windeployqt to deploy share-link library version of app. It also shows me blank window. But it can run on Windows 7.
The output of qtdiag on my virtual XP:
Qt 5.5.0 (i386-little_endian-ilp32 static release build; by MSVC 2013)
on "windo ws" OS: Windows XP [winnt version 5.1.2600]
Architecture: i386; features: SSE2 SSE3 SSSE3 SSE4.1 SSE4.2
Library info: PrefixPath: D:\Qt\qt-5.5.0-x86-static
DocumentationPath: D:\Qt\qt-5.5.0-x86-static\doc HeadersPath:
D:\Qt\qt-5.5.0-x86-static\include LibrariesPath:
D:\Qt\qt-5.5.0-x86-static\lib LibraryExecutablesPath:
D:\Qt\qt-5.5.0-x86-static\bin BinariesPath:
D:\Qt\qt-5.5.0-x86-static\bin PluginsPath:
D:\Qt\qt-5.5.0-x86-static\plugins ImportsPath:
D:\Qt\qt-5.5.0-x86-static\imports Qml2ImportsPath:
D:\Qt\qt-5.5.0-x86-static\qml ArchDataPath:
D:\Qt\qt-5.5.0-x86-static DataPath: D:\Qt\qt-5.5.0-x86-static
TranslationsPath: D:\Qt\qt-5.5.0-x86-static\translations
ExamplesPath: D:\Qt\qt-5.5.0-x86-static\examples TestsPath:
D:\Qt\qt-5.5.0-x86-static\tests SettingsPath:
Standard paths [... denote writable entry]: DesktopLocation:
"Desktop" *C:\Documents and Settings\Administrator\
The final conclusion:
The problem is the graphic driver in my virtual Windows XP. It can run on other real PCs.
But there is a sad problem to static build of QML.
I have found this:
https://forum.qt.io/topic/22035/qml-apps-not-runnable-using-static-build-up-to-qt-5-0-1-release/24
The reason why I need copy such folders Qt QtQuick.2 QtQuick is that those lib cannot be compile-loaded. Even if I add them into .pro file. From Qt 5.0 to Qt 5.5. The official side seems do not like people use QML by static-link. So, it is waste of time to do static build of QML app.
Qt Quick applications need 3d acceleration in order to work. This is based on either OpenGL, DirectX via Angle or some kind of software renderer that comes with the commercial version of Qt. Since you specifically exclude Angle in your config, you need a proper OpenGL driver. Make sure that OpenGL works on your machine. You'll find tools for that.
I don't think that is has something to do with missing C++ standard libraries (VC2013 runtime), because in this case your application would crash during start and not run. Qt Quick graphic issues however often lead to a running black app that is writing warnings to the console.
Further debugging can be done using the qtdiag.exe command line tool that comes with Qt (It comes with the online installer. I don't know where it is when you build from source). It checks for you which graphic driver is used and often can show error messages.
I'm attempting to use Qt creator to cross-compile a project, but have an issue matching the Qt version and my specified compiler toolchain.
I have created a Kit setting up a Device, selecting my toolchain as the compiler (GCC ARM Linux in this case), but I only have a locally installed system Qt (5.0.2 on Mint x86).
Qt Creator understandably tells me the compiler cannot produce code for the Qt version; all the guides I have found suggest using a Qt compiled for the target platform. This doesn't make sense though - it attempts to run qmake compiled for a different architecture and fails
How do I install or configure/compile a Qt version to work with the cross compiler? Maybe I can modify my existing one to understand this setup?
Thanks
This makes absolutely sense. The advice to use a Qt, which is compiled for your target platform is correct. But this does not mean that you use a Qt that was compiled natively on that target platform. You need to use a Qt, which was compiled with a special cross compiler on your host platform for your target platform. This way qmake and other build tools remain executable on your host, but create configurations for your target.
So, if you have a compiler, which can create ARM code, use it to build your Qt. Then you can create a kit in QtCreator out of this compiler/Qt pair.
Greenflow is right. I would like to add some information. I have cross compiled Qt 5.4.1 on Windows having an ARM Linux as target platform. You just need to configure the build properly. Here's what I did:
./configure -platform win32-g++ -xplatform linux-arm-gnueabihf-g++ .....
So Qt tools (qmake,moc,etc...) were built as Windows binaries and all the libraries were built as Linux binaries. Check for the available platforms in qtbase/mkspecs.
I am not able to run programs from Qt Creator, I am always getting error:
Starting C:\path\to\executable\program.exe...
Failed to start program. Path or permissions wrong?
C:\path\to\executable\program.exe exited with code -1
It happened after I built Qt statically. What I did:
Installed Qt 5.2.0 with MinGW from official site (including source component), then installed Python 2.7.6 and Perl. Then built Qt statically from path\to\qt\5.2.0\Src and it showed no errors. After this everything was fine. But when I added new path to qmake.exe (in Qt Versions tab, Build & Run Options section) and added new Kit (Kits tab) with this version I started getting this error. Moreover, now all .exe files have yellow shield near the icon in the Explorer (no matter they were built statically or not). It means that they use administrative privileges, but before I added new Kit executables had no yellow shield! For statically built programs it is fine that Creator can't run them because of administrative privileges that the use, but what happened to dynamically linked programs? I didn't touch any other settings except for adding new Kit.
Edit:
I am using MinGW on Windows 8.1,
qt was configured with this line:
configure.exe -release -opensource -c++11 -static -no-opengl -no-angle -no-vcproj -platform win32-g++ -nomake examples -nomake tests
I seem to have exactly the same problem as iamnp.
In my case, this is an application that compiles and runs smoothly on Windows 7 with Qt 4.8. Adding to the issue is that I'm switching both operating system (Windows 8.1) and Qt version (Qt 5.2) at the same time. But, I wouldn't be surprised that I and iamnp are actually not the only people having this issue.
I have tried the solution of Guilherme (i.e. run QT Creator as administrator), but this didn't resolve the problem.
If somebody has some other idea on what I should try, let me know. In the meantime, I'll try to test this in a minimal application to see what happens.