14.5. Building the CamCOPS client¶
The CamCOPS client is written in C++11 using the Qt cross-platform framework. We provide a custom python script to build Qt from source, along with its dependencies (OpenSSL, SQLCipher and FFmpeg). CamCOPS can then be compiled and linked with this custom version of Qt. This can be done within Qt Creator, which confusingly is bundled with a second, official distribution of Qt.
14.5.1. Prerequisites¶
Ensure the following prerequisites are met: https://wiki.qt.io/Building_Qt_6_from_Git
14.5.1.1. Linux¶
Linux should come with Python and the necessary build tools. The build script should warn about any missing ones, which should all be installable with your package manager.
See https://github.com/ucam-department-of-psychiatry/camcops/blob/master/.github/workflows/build-qt.yml for the installation requirements on Ubuntu 20.04 and 22.04 (GitHub hosted runners).
14.5.1.2. Android (with a Linux build host)¶
To build Android programs under Linux, you will also need a Java development kit (JDK), such as OpenJDK:
sudo apt install openjdk-17-jdk
. If you are switching between different versions of Java, you can set up a symbolic link to /usr/lib/jvm/default-java:ln -s /usr/lib/jvm/java-17-openjdk-amd64 /usr/lib/jvm/default-java
You will also need to install Android SDK_. The current Android SDK target version is shown in
AndroidManifest.xml
. This is the version you need to install.Set up a script file with variables like these:
export JAVA_HOME=/usr/lib/jvm/default-java export ANDROID_SDK_ROOT="/path/to/your/android-sdk" export ANDROID_NDK_ROOT="${ANDROID_SDK_ROOT}/ndk" export ANDROID_NDK_HOME="${ANDROID_NDK_ROOT}" export PATH="$PATH:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin"
Source it when you want to use Android tools. Alternatively add these line to your
.profile
(or similar) so they are set up automatically whenever you log in.In Qt Creator, under
Preferences --> Devices --> Android
setJDK location:
to/usr/lib/jvm/default-java
. Select the currently supported NDK version in Android NDK list and make it the default. See https://doc.qt.io/qt-6.5/android-getting-started.html.If Qt complains about e.g.
failed to find Build Tools revision 19.1.0
, then you can usesdkmanager --list
and then install with e.g.sdkmanager "build-tools;19.1.0"
, or in Qt Creator’sTools --> Options --> Devices --> Android --> SDK Manager
..Note some Android SDK version constraints:
Google Play store requires
targetSdkVersion
to be at least 33 from 2023-08-31 (https://developer.android.com/google/play/requirements/target-sdk).Above Android API 23, linking to non-public libraries is prohibited, possibly with exceptions for SSL/crypto.
Android libraries should be compiled for the same SDK version as
minSdkVersion
inAndroidManifest.xml
(see https://stackoverflow.com/questions/21888052/what-is-the-relation-between-app-platform-androidminsdkversion-and-androidtar/41079462#41079462, and https://developer.android.com/ndk/guides/stable_apis).
Todo
Maybe “Include prebuilt OpenSSL libraries” will simplify things?
14.5.1.3. Windows¶
Install a recent version of Python. Make sure it’s on your
PATH
.Install a Microsoft Visual C++ compiler. A free one is Visual Studio Community. As you install Visual Studio, don’t forget to tick the C++ options.
Install these other tools. Many are available with Chocolatey.
CMake. (We’ll use this version of cmake to build CamCOPS.)
MSYS2. Use this to install other build tools.
C:\tools\msys64\usr\bin\bash
then$ pacman -S make yasm diffutils
.NASM, the Netwide Assembler for x86-family processors.
ActiveState TCL. (SQLCipher requires
tclsh
.)ActiveState Perl. or Strawberry Perl. (OpenSSL requires
perl
.)Optionally, Debugging Tools for Windows (including CDB), such as from the Windows SDK.
ImageMagick; make sure you also install the C/C++ development headers (see http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows).
Add everything to the
PATH
.In Windows 10, persistent environment variable settings are accessible by searching the Start menu for “environment variables”, or
.You can use either the User or the System settings, as you see fit.
PATH elements are separated with semicolons, if you edit the path manually.
For example, you may want these:
C:\tools\msys64 C:\tools\msys64\usr\bin C:\Program Files\NASM C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build -- These are usually added automatically by installers: C:\Program Files\Git\cmd C:\ActiveTcl\bin C:\Perl64\bin
Do make sure that the
PATH
doesn’t have an unquoted ampersand in; this is technically legal but it causes no end of trouble (see build_qt.py). (The usual culprit is MySQL.) The build_qt.py script will check this.
Tested and as part of our continuous integration process on GitHub (see https://github.com/ucam-department-of-psychiatry/camcops/blob/master/.github/workflows/build-qt.yml ) and as of 2023-12-21: .. code-block:: none
ActivePerl 5.28.1 build 2801 (64-bit) ActiveTcl 8.6.7 build 0 (64-bit) CCache 3.7.12 CMake 3.25.1 (64-bit) Microsoft Visual Studio Community 2019 MSYS2 20231026.0.0 NASM 2.14.02 (64-bit) Python 3.9.13 Qt Creator 4.10.1 Windows 10 (64-bit) Yasm 1.2.0
14.5.1.4. macOS (formerly OS X)¶
Tested in Feb 2021 with:
# macOS Catalina 10.15.7 # Xcode 12.4 (macOS SDK 11.1; iOS SDK 14.4) build_qt --build_macos_x86_64
14.5.1.5. All operating systems¶
Install the open-source edition of Qt, with Qt Creator. (You only really need the Tools component. We will fetch Qt separately.)
Make sure you have Git installed.
Set some environment variables, so we can be consistent in these instructions. Specimen values:
Environment variable
Example value (Linux, MacOS)
Example value (Windows)
Notes
CAMCOPS_QT6_BASE_DIR
~/dev/qt_local_build
%USERPROFILE%\dev\qt_local_build
Read by build_qt.py.
CAMCOPS_SOURCE_DIR
~/dev/camcops
%USERPROFILE%\dev\camcops
Used in these instructions and by the Windows Inno Setup script.
CAMCOPS_VENV
~/dev/camcops_venv
%USERPROFILE%\dev\camcops_venv
Used in these instructions.
CAMCOPS_VISUAL_STUDIO_REDIST_ROOT
N/A.
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\14.29.30133
Used by the Windows Inno Setup script.
Fetch CamCOPS. For example, for the GitHub version:
# Linux git clone https://github.com/ucam-department-of-psychiatry/camcops $CAMCOPS_SOURCE_DIR
REM Windows git clone https://github.com/ucam-department-of-psychiatry/camcops %CAMCOPS_SOURCE_DIR%
Create a virtual environment and install some Python tools:
# Linux python3 -m venv $CAMCOPS_VENV . $CAMCOPS_VENV/bin/activate pip install cardinal_pythonlib
REM Windows python -m venv %CAMCOPS_VENV% %CAMCOPS_VENV%\Scripts\activate pip install cardinal_pythonlib
14.5.2. Build OpenSSL, SQLCipher, Qt¶
Build a copy of Qt and supporting tools (OpenSSL, SQLCipher, FFmpeg) from source using the CamCOPS build_qt.py tool (q.v.). For example:
# Linux
$CAMCOPS_SOURCE_DIR/tablet_qt/tools/build_qt.py --build_all
REM Windows
python %CAMCOPS_SOURCE_DIR%/tablet_qt/tools/build_qt.py --build_all
14.5.2.1. Version constraints for OpenSSL and SQLCipher¶
Qt 6.5 supports OpenSSL 3.0.x
OpenSSL 3.0.x is the current LTS version, supported until 2026-09-07. https://www.openssl.org/policies/releasestrat.html
SQLCipher 4.4.5 supports OpenSSL 3.0.x
14.5.2.2. Troubleshooting build_qt¶
14.5.2.2.1. Problem: aarch64-linux-android-gcc-4.9: not found¶
You might see this when compiling for Android/64-bit ARM. The relevant arm64
cross-compiler is missing. See
https://stackoverflow.com/questions/28565640/build-kernel-with-aarch64-linux-gnu-gcc
and try e.g. sudo apt-get install gcc-aarch64-linux-gnu
.
Todo
IN PROGRESS ARM64
sudo apt-get install gcc-4.9-aarch64-linux-gnu
14.5.3. Run and set up Qt Creator¶
Run Qt Creator.
If you are compiling for Android:
Configure your Android SDK/NDK and Java JDK at:
, or in newer versions of Qt Creator, .
Proceed with the instructions below.
14.5.4. Qt versions¶
See
, or on MacOS, see .Assuming you set your qt_local_build directory to ~/dev/qt_local_build
, the
build_qt.py script should have generated a series of qmake
(or, under
Windows, qmake.exe
) files within that directory:
Operating system
qmake
Linux, x86 64-bit
qt_linux_x86_64_install/bin/qmake
Android, ARM 32-bit
qt_android_armv7_install/bin/qmake
Android, ARM 64-bit
qt_android_armv8_64_install/bin/qmake
Android emulator, x86 32-bit
qt_android_x86_32_install/bin/qmake
Mac OS/X, x86 64-bit
qt_osx_x86_64_install/bin/qmake
iOS, ARM 32-bit
qt_ios_armv7_install/bin/qmake
iOS, ARM 64-bit
qt_ios_armv8_64_install/bin/qmake
iOS Simulator, x86 64-bit
qt_ios_x86_64_install/bin/qmake
Windows, x86 32-bit
qt_windows_x86_32_install/bin/qmake
Windows, x86 64-bit
qt_windows_x86_64_install/bin/qmake
Select the correct qmake
and it will be added as a Qt version. You can
change its name (prefixing “Custom” may be helpful to recognize it).
14.5.5. Qt kits¶
See
, or on MacOS, see .Note
If you did not install a version of Qt with Qt Creator, pick one of your
own kits and choose “Make Default”. Otherwise you will get the error
Could not find qmake spec 'default'.
(e.g. in the General Messages tab
when you open your application) and the .pro
(project) file will not
parse. See https://stackoverflow.com/questions/27524680.
Non-default options are marked in bold and/or as “[non-default]”.
Custom_Linux_x86_64
Last checked against Qt Creator 11.0.2 (built Aug 2023).
Option
Setting
Name
[non-default]
Custom_Linux_x86_64
File system name
Run device type
Desktop
Run device
Desktop (default for Desktop)
Build device
Desktop (default for Desktop)
Sysroot
Compiler: C
GCC (C, x86 64bit in
/usr/bin
)Compiler: C++
GCC (C++, x86 64bit in
/usr/bin
)Environment
[not editable: “No changes to apply.”]
Debugger
System GDB at
/usr/bin/gdb
Qt version
THE “LINUX 64-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
Additional Qbs Profile Settings
CMake Tool
System CMake at
/usr/bin/cmake
CMake generator
[not editable: “Ninja”]
CMake Configuration
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
Custom_Android_ARM32: 32-BIT configuration for clang
Last checked against Qt Creator 11.0.2 (built 12 Aug 2023) under Linux.
Option
Setting
Name
[non-default]
Custom_Android_ARM32
File system name
Run device type
Android Device
Run device
YOUR DEVICE
Build device
Desktop (default for Desktop)
Sysroot
Compiler: C
Android Clang (C, arm, NDK 25.1.8937393)
Compiler: C++
Android Clang (C++, arm, NDK 25.1.8937393)
Environment
[not editable: “No changes to apply.”]
Debugger
Android Debugger (armeabi-v7a, NDK 25.1.8937393)
Qt version
THE “ANDROID, ARM 32-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
Additional Qbs Profile Settings
CMake Tool
CMake 3.24.2 (Qt)
CMake Generator
Ninja
CMake Configuration
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
Custom_Android_ARM64
Last checked against Qt Creator 11.0.2 (built 12 Aug 2023) under Linux.
Option
Setting
Name
[non-default]
Custom_Android_ARM64
File system name
Run device type
Android Device
Run device
YOUR DEVICE
Build device
Desktop (default for Desktop)
Sysroot
Compiler: C
Android Clang (C, aarch64, NDK 25.1.8937393)
Compiler: C++
Android Clang (C++, aarch64, NDK 25.1.8937393)
Environment
[not editable: “No changes to apply.”]
Debugger
Android Debugger (arm64-v8a, NDK 25.1.8937393)
Qt version
THE “ANDROID, ARM 64-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
Additional Qbs Profile Settings
CMake Tool
CMake 3.24.2 (Qt)
CMake Generator
Ninja
CMake Configuration
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
Custom_Android_x86 – NOT FULLY TESTED
Option
Setting
Name
[non-default]
Custom_Android_x86
File system name
Device type
Android Device
Device
Run on Android (default for Android)
Sysroot
Compiler: C
<No compiler>
Compiler: C++
Android GCC (i686-4.9)
Environment
[not editable: “No changes to apply.”]
Debugger
Android Debugger for Android GCC (i686-4.9)
Qt version
THE “ANDROID EMULATOR” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
CMake Tool
System CMake at
/usr/bin/cmake
CMake Generator
CodeBlocks - Unix Makefiles
CMake Configuration
[not editable]
Additional Qbs Profile Settings
Custom_Windows_x86_64
Last checked against Qt Creator 4.8.1 (built Jan 2019).
Option
Setting
Name
[non-default]
Custom_Windows_x86_64
File system name
Device type
Desktop
Device
Local PC (default for Desktop)
Sysroot
[non-default]
[...]\qt_local_build\qt_windows_x86_64_install\bin
Compiler: C
Microsoft Visual C++ Compiler 14.0 (amd64)
Compiler: C++
Microsoft Visual C++ Compiler 14.0 (amd64)
Environment
[not editable: “No changes to apply.”]
Debugger
Auto-detected CDB at
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe
Qt version
THE “WINDOWS 64-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
CMake Tool
System CMake at
C:\Program Files (x86)\CMake\bin\cmake.exe
CMake Generator
CodeBlocks - MinGW Makefiles, Platform: <none>, Toolset: <none>
CMake Configuration
CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
Additional Qbs Profile Settings
Also works with: CMake Generator = CodeBlocks - NMake Makefiles JOM, Platform: <none>, Toolset: <none>.
Custom_Windows_x86_32
Last checked against Qt Creator 4.8.1 (built Jan 2019).
Option
Setting
Name
``Custom_Windows_x86_32``
File system name
Device type
Desktop
Device
Local PC (default for Desktop)
Sysroot
[non-default]
[...]\qt_local_build\qt_windows_x86_32_install\bin
Compiler: C
Microsoft Visual C++ Compiler 14.0 (amd64_x86)
Compiler: C++
Microsoft Visual C++ Compiler 14.0 (amd64_x86)
Environment
[not editable: “No changes to apply.”]
Debugger
None
Qt version
THE “WINDOWS 32-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
CMake Tool
System CMake at
C:\Program Files (x86)\CMake\bin\cmake.exe
CMake Generator
CMake Configuration
CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
Additional Qbs Profile Settings
Note
For the Microsoft Visual C++ compiler, amd64
means 64-bit and x86
means 32-bit. Then the two-part options are cross-compilers, in which the
first part is the type of the host machine (the one running the compiler)
and the second part is the type of the destination machine (the one that
will run the compiled executable). Therefore, in full, x86
produces
32-bit output using a 32-bit compiler; amd64
produces 64-bit output
using a 64-bit compiler (i.e. requiring a 64-bit computer to do the
compiling); x86_amd64
produces 64-bit output using a 32-bit compiler
(so you can build for 64-bit machines using a 32-bit machine), and
amd64_x86
produces 32-bit output using a 64-bit compiler. So, if you
have a 64-bit machine, you probably want to use amd64_x86
and
amd64
; if you have a 32-bit machine, you definitely want to use x86
and x86_amd64
.
Custom_MacOS_x86_64
Last checked against Qt Creator 11.0.3 (built 27 Sep 2023).
Option
Setting
Name
[non-default]
Custom_MacOS_x86_64
File system name
Run device type
Desktop
Run device
Desktop (default for Desktop)
Build device
Desktop (default for Desktop)
Sysroot
Compiler: C
Clang (C, x86 64bit in /usr/bin)
Compiler: C++
Clang (C++, x86 64bit in /usr/bin)
Environment
[not editable: “No changes to apply.”]
Debugger
System LLDB at /usr/bin/ldb
Qt version
THE “MACOS 64-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
Additional Qbs Profile Settings
CMake Tool
System CMake at /usr/local/bin/cmake
CMake Generator
Ninja
CMake Configuration
CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
Custom_iOS_armv8_64
Last checked against Qt Creator 11.0.3 (built 27 Sep 2023).
Option
Setting
Name
[non-default]
Custom_iOS_armv8_64
File system name
Run device type
iOS device
Run device
YOUR DEVICE
Build device
Desktop (default for Desktop)
Sysroot
Compiler: C
Apple Clang (arm64)
Compiler: C++
Apple Clang (arm64)
Environment
[not editable: “No changes to apply.”]
Debugger
System LLDB at /usr/bin/lldb
Qt version
THE “iOS 64-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
Additional Qbs Profile Settings
CMake Tool
System CMake at /usr/local/bin/cmake
CMake Generator
Xcode
CMake Configuration
-DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx}
If Qt accept the settings, a section marked “iOS Settings” will appear in the “Build Settings” part of your project when configured for this kit.
Custom_iOS_Simulator_x86_64
Option
Setting
Name
[non-default]
Custom_iOS_Simulator_x86_64
File system name
Device type
iOS Simulator
Device
iOS Simulator (default for iOS Simulator)
Sysroot
[non-default]
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
Compiler: C
Apple Clang (x86_64)
Compiler: C++
Apple Clang (x86_64)
Environment
[not editable: “No changes to apply.”]
Debugger
System LLDB at /Applications/Xcode.app/Contents/Developer/usr/bin/lldb
Qt version
THE “iOS SIMULATOR 64-BIT” ONE FROM QT VERSIONS, ABOVE
Qt mkspec
Additional Qbs Profile Settings
CMake Tool
System CMake at /usr/local/bin/cmake
CMake Generator
CodeBlocks - Unix Makefiles, Platform: <none>, Toolset: <none>
CMake Configuration
CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}
CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
If Qt accept the settings, a section marked “iOS Settings” will appear in the “Build Settings” part of your project when configured for this kit.
14.5.6. Build settings¶
14.5.6.1. Android¶
Under
:
Option
Setting
android-33 [= default].
~/Documents/CamCOPS/android_keystore/CAMCOPS_ANDROID_KEYSTORE.keystore
[NB not part of published code, obviously!]Yes (at least for release versions)
Additional libraries
~/dev/qt6_local_build/openssl_android_armv8_64_build/openssl-3.0.12/libcrypto_3.so
~/dev/qt6_local_build/openssl_android_armv7_build/openssl-3.0.12/libssl_3.so
If you run this without a keystore, it produces a debug build (e.g.
QtApp-debug.apk
). If you run it with a keystore/signature, it produces
android-build-release-signed.apk
(formerly QtApp-release-signed.apk
).
The APK filename is fixed at this point
(https://forum.qt.io/topic/43329/qt-5-3-1-qtcreator-rename-qtapp-debug-apk-to-myapp).
We can rename the APK if we want, or just upload to Google Play, distribute,
etc.
Qt will forget your “sign package” choice from time to time; get back to it via
.14.5.6.2. iOS¶
See:
It is possible to deploy to an actual device via USB or the iOS simulator using a development provisioning profile associated with an Apple developer ID. You need to enable developer mode on the device.
Some build/deploy problems can be solved by restarting Qt Creator, XCode and any running iOS simulator but check the error messages in Qt Creator first.
14.5.7. MacOS¶
See:
14.5.7.1. General¶
(I’d like to put general settings in a camcops.pro.shared
file, as per
http://doc.qt.io/qtcreator/creator-sharing-project-settings.html, but this
isn’t working well at present.)
Open the
camcops.pro
project file in Qt Creator.Add your chosen kit(s) to the CamCOPS project.
Use defaults, except everywhere you see
, add-j 8
for an 8-CPU machine to get it compiling in parallel.To save this effort, set
MAKEFLAGS="-j8"
in your user environment (e.g. in~/.bashrc
, or~/.profile
); see https://stackoverflow.com/questions/8860712/setting-default-make-options-for-qt-creator. HOWEVER, Qt Creator doesn’t seem to read that environment variable for me. Not sure why!
Build.
Once built, see Releasing CamCOPS.
14.5.8. Notes¶
14.5.8.1. Debugging¶
DON’T FORGET to set up both Debug and Release (+/- Profile) builds.
Phone USB debugging negotiation sometimes takes a while. On the Samsung Galaxy phone, the alert light goes red when in Debug mode.
If a USB Android device appears not to connect (via
adb devices
), appears then disappears as you connect it (vialsusb | wc
), and gives thedmesg
errordevice descriptor read/64, error -71
or similar, try a different cable (see https://stackoverflow.com/questions/9544557/debian-device-descriptor-read-64-error-71); try also plugging it directly into the computer’s USB ports rather than through a hub.If you lose the debugger windows in Qt Creator midway through a debug session, press Ctrl-4.
This error (with a variety of compiler names):
.../mkspecs/features/toolchain.prf(50): system(execute) requires one or two arguments. Project ERROR: Cannot run compiler 'g++'. Maybe you forgot to setup the environment?
means that you need to re-run qmake manually. It usually occurs if you delete your build* directories.
For debugging, consider install Valgrind:
sudo apt install valgrind
14.5.8.2. Android debugging¶
Android logs
The default Android log format from
adb logcat
is explained at https://developer.android.com/studio/debug/am-logcat.html. That format isdate time PID-TID/package priority/tag: message e.g. 12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent. but actually looks like 06-18 23:47:48.731 28303 28344 E : dlsym failed: undefined symbol: main 06-18 23:47:48.731 28303 28344 E : Could not find main method
So do:
Search for “Force finishing activity”.
Better, though, is to launch from Qt Creator, which automatically filters (and does so very well).
14.5.8.3. Troubleshooting qmake/compilation¶
Sometimes you have to restart Qt creator after creating new build settings; it loses its .pro file and won’t show the project, or complains of a missing .pro file when you try to build.
The first build can be very slow as it compiles all the resources; this usually looks like a process stuck compiling qrc_camcops.cpp to qrc_camcops.o
If builds are very slow, you may have forgotten to use all your CPU cores; try e.g.
-j 8
(for 8 cores) as an argument to make, as above.If an Android build fails for a bizarre reason (like garbage in a .java file that looks like it’s been pre-supplied), delete the whole build directory, which is not always removed by cleaning.
That includes the Java error “duplicate class”, e.g.
error: duplicate class: org.qtproject.qt5.android.bindings.QtLoader
(https://stackoverflow.com/questions/43774714).
Error: "unsupported_android_version" is not translated
: see https://bugreports.qt.io/browse/QTBUG-63952. This error does not prevent you from continuing.This error whilst building CamCOPS:
/home/rudolf/dev/qt_local_build/qt_linux_x86_64_install/bin/qmlimportscanner: error while loading shared libraries: libicui18n.so.55: cannot open shared object file: No such file or directory /home/rudolf/dev/qt_local_build/qt_linux_x86_64_install/mkspecs/features/qt.prf:312: Error parsing JSON at 1:1: illegal value Project ERROR: Failed to parse qmlimportscanner output.
… occurred after an upgrade from Ubuntu 16.04 to 18.04; the problem relates to missing OS libraries (
libicu
); the easiest thing is to rebuild Qt.This error whilst building CamCOPS:
/usr/bin/x86_64-linux-gnu-ld: cannot find -ludev Makefile:2433: recipe for target 'camcops' failed collect2: error: ld returned 1 exit status
… use
sudo apt install libudev-dev
.This error whilst building CamCOPS under Windows 10:
:-1: error: dependent 'C:\Users\rudol\dev\qt_local_build\qt_windows_x86_64_install\lib\Qt5MultimediaWidgetsd.lib' does not exist.
Try switching from “debug” to “release” build.
Missing libraries under Ubuntu/Debian Linux:
For example, for the error “cannot find -lgstphotography-1.0”, try
apt-file search gstphotography
. Prefer packages with a-dev
suffix as these have development headers.
14.5.8.4. Troubleshooting running CamCOPS¶
Runtime error, failing to find
libssl.so
orlibcrypto.so
:Starting /.../camcops... /.../camcops: error while loading shared libraries: libssl.so: cannot open shared object file: No such file or directory /.../camcops exited with code 127
CamCOPS needs the
libssl.so
andlibcrypto.so
that was built by build_qt.py. Until we have a proper Linux client distribution, do this:$ export LD_LIBRARY_PATH=~/dev/qt_local_build/openssl_linux_x86_64_build/openssl-1.1.0g/
… or wherever you built those
.so
libraries. Then re-run the CamCOPS .client.This error whilst running CamCOPS (Ubuntu 18.04):
Starting /.../camcops... /.../camcops: error while loading shared libraries: libOpenVG.so.1: cannot open shared object file: No such file or directory /.../camcops exited with code 127
Thoughts:
# Which files have similar names? $ find -L / -type f -name "libOpenVG.so*" 2>/dev/null /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so.1 # symlink to libOpenVG.so.1.0.0 /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so.1.0.0 # actual file /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so # symlink to libOpenVG.so.1.0.0 /usr/lib/x86_64-linux-gnu/libOpenVG.so # symlink to mesa-egl/libOpenVG.so # Which packages provide these files? $ dpkg --search libOpenVG libopenvg1-mesa:amd64: /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so.1.0.0 libopenvg1-mesa-dev: /usr/lib/x86_64-linux-gnu/libOpenVG.so libopenvg1-mesa-dev: /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so libopenvg1-mesa:amd64: /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so.1 # Ergo, the problem can be solved with: $ sudo ln -s /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so.1 /usr/lib/x86_64-linux-gnu/libOpenVG.so.1 # Yup, that fixes it.
Solution:
sudo ln -s /usr/lib/x86_64-linux-gnu/mesa-egl/libOpenVG.so.1 /usr/lib/x86_64-linux-gnu/libOpenVG.so.1