Problems Qt 5.15.2 / cmake and Android project
-
Hi,
ich habe mein Qt/Quick Projekt unter Linux / Windows wunderbar am laufen. Jetzt will ich das selbe Projekt auch für Android arm8-64 erstellen. Das Android-SDK habe ich runter geladen und openjdk 1.8 aus meiner Ubuntu 21.10.
Wenn ich im Qt Creator jetzt das Projekt für Android konfigurieren will kommen nur Fehlermeldungen:Führe /opt/Extern/Entwicklung/Qt/Tools/CMake/bin/cmake -S /home/martin/Entwicklung/qt/qt_gc_cmake -B /home/martin/Entwicklung/qt/build-qt_gc_cmake-Android_Qt_5_15_2_Clang_Multi_Abi-Debug -GNinja -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=/opt/Extern/Entwicklung/Qt/Tools/QtCreator/share/qtcreator/package-manager/auto-setup.cmake -DQT_QMAKE_EXECUTABLE:STRING=/opt/Extern/Entwicklung/Qt/5.15.2/android/bin/qmake -DCMAKE_PREFIX_PATH:STRING=/opt/Extern/Entwicklung/Qt/5.15.2/android -DCMAKE_C_COMPILER:STRING=/opt/Extern/Entwicklung/Android/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -DCMAKE_CXX_COMPILER:STRING=/opt/Extern/Entwicklung/Android/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ -DANDROID_NATIVE_API_LEVEL:STRING=21 -DANDROID_NDK:PATH=/opt/Extern/Entwicklung/Android/android-sdk/ndk/21.3.6528147 -DCMAKE_TOOLCHAIN_FILE:PATH=/opt/Extern/Entwicklung/Android/android-sdk/ndk/21.3.6528147/build/cmake/android.toolchain.cmake -DANDROID_ABI:STRING=armeabi-v7a -DANDROID_STL:STRING=c++_shared -DCMAKE_FIND_ROOT_PATH:PATH=/opt/Extern/Entwicklung/Qt/5.15.2/android -DANDROID_SDK:PATH=/opt/Extern/Entwicklung/Android/android-sdk in /home/martin/Entwicklung/qt/build-qt_gc_cmake-Android_Qt_5_15_2_Clang_Multi_Abi-Debug aus. CMAKE fuer project: qt_gc -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /opt/Extern/Entwicklung/Android/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/bin/clang - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /opt/Extern/Entwicklung/Android/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done CMAKE fuer project: libdatad CMAKE fuer project: libdb CMake Error at /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5Core/Qt5AndroidSupport.cmake:126 (add_custom_target): add_custom_target cannot create target "apk" because another target with the same name already exists. The existing target is a custom target created in source directory "/home/martin/Entwicklung/qt/qt_gc_cmake/lib-datad". See documentation for policy CMP0002 for more details. Call Stack (most recent call first): /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake:94 (include) /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:232 (include) /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5/Qt5Config.cmake:28 (find_package) lib-db/CMakeLists.txt:16 (find_package) CMake Error at /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5Core/Qt5AndroidSupport.cmake:135 (add_custom_target): add_custom_target cannot create target "aab" because another target with the same name already exists. The existing target is a custom target created in source directory "/home/martin/Entwicklung/qt/qt_gc_cmake/lib-datad". See documentation for policy CMP0002 for more details. Call Stack (most recent call first): /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5Core/Qt5CoreConfigExtras.cmake:94 (include) /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:232 (include) /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5/Qt5Config.cmake:28 (find_package) lib-db/CMakeLists.txt:16 (find_package)
Kann mir einer sagen, wo der Fehler herkommt? Gibt es eine Doku / Tutorial von Qt wo das erstellen einer Android APK mit CMAKE erklärt wird?
Wie wähle ich denn in dem Multi-ABI aus welches Ziel Device ich haben will? Bei mir wählt er immer den 32-Bit Arm compiler.
Danke für Eure Hilfe.
gruss
martin -
Oh, das sieht ja echt nach einem suboptimalen Konstrukt in Qt5AndroidSupport.cmake aus - man kann diese Datei offensichtlich nicht zweimal inkludieren (was bei Dir indirekt passiert).
Nimm bitte mal dieproject()
- Zeilen in beiden libs raus - vielleicht reicht das schon damit cmake merkt dass es die Datei schon einmal geparst hat.Siehe https://bugreports.qt.io/browse/QTBUG-87863 und der Patch hier: https://codereview.qt-project.org/c/qt/tqtc-qtbase/+/364205/2/src/corelib/Qt5AndroidSupport.cmake
-
@msauer75
Keine Ahnung ob es da für cmake einen unterschied gibt, vielleicht 🤷♂️, aber für qmake als buildsystem kann man das in den "Build Settings" tab einstellen.- Linke Seite options Punkt "Projekt"
- Android Paket auswählen
- Build Steps -> ABI's checkbox gewünscht setzen
wenn du schon da bist, stelle sicher, dass die Checkbox "Shadow build" gecheckt ist, sollte deinen Fehler beheben
-
Hallo,
für das CMAKE System würde ich es auch können, ich komme da nur nicht hin, da das Erstellen des CMAKE Files nicht funktioniert. Hier bekomme ich immer die Fehlermeldung:CMake Error at /opt/Extern/Entwicklung/Qt/5.15.2/android/lib/cmake/Qt5Core/Qt5AndroidSupport.cmake:135 (add_custom_target):
add_custom_target cannot create target "aab" because another target with
the same name already exists. The existing target is a custom target
created in source directory
"/home/martin/Entwicklung/qt/qt_gc_cmake/lib-datad". See documentation for
policy CMP0002 for more details.Was die mir sagen soll weiss ich nicht.
gruss
martin -
Du hast zwei executables/libraries mit denselben namen (aab) - das wird nicht unterstützt
-
Das muss von deinen CMake-files kommen
-
@J-Hilk said in Problems Qt 5.15.2 / cmake and Android project:
ist der Harken gesetzt?
weil die MeldungThe existing target is a custom target created in source directory
lässt mich glauben das du ein in source build machst.
-
Ok. Du hast Recht. Ich habe ein Projekt das eine APP hat und aus mehreren Libraries besteht.
Das ist das Haupt CMakeLists.txt:
cmake_minimum_required(VERSION 3.14) set(APP "qt_gc") message("CMAKE fuer project: " ${APP}) if (WIN32) set(SSLDIR "d:/Programme/Qt/Tools/OpenSSL/Win_x64/bin/") set(SSLLIB1 "crypto-1_1-x64") set(SSLLIB2 "ssl-1_1-x64") message(" WIN32: SSLDIR=" ${SSLDIR}) message(" WIN32: SSLLIB=" ${SSLLIB1} " " ${SSLLIB2}) endif () if (ANDROID) message(" ANDROID: ") endif () project(${APP} VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/_Builds/${CMAKE_BUILD_TYPE}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(LIBTYP "SHARED") add_subdirectory(lib-datad) add_subdirectory(lib-db)
Dies ist von lib-datad:
cmake_minimum_required(VERSION 3.14) set(LIB "datad") set(LIBDEF "LIBDATAD_LIBRARY") message("CMAKE fuer project: lib" ${LIB}) project(lib-${LIB} VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt5 COMPONENTS Core REQUIRED) find_package(Qt5 COMPONENTS Qml REQUIRED) include_directories("source/") include_directories("source/helper") set(SOURCES source/data-decorator.cpp source/bool-decorator.cpp ) add_library(${LIB} ${LIBTYP} ${SOURCES}) target_link_libraries( ${LIB} Qt5::Core ) target_compile_definitions(${LIB} PRIVATE ${LIBDEF}) target_compile_definitions(${LIB} PUBLIC "QT_DEPRECATED_WARNINGS")
Und das von lib-db:
cmake_minimum_required(VERSION 3.14) set(LIB "db") set(LIBDEF "LIBDB_LIBRARY") message("CMAKE fuer project: lib" ${LIB}) project(lib-${LIB} VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt5 COMPONENTS Core REQUIRED) find_package(Qt5 COMPONENTS Sql REQUIRED) include_directories("source/") set(SOURCES source/database.cpp source/database.h source/lib-db_global.h ) if (ANDROID) message("ANDROID: ") endif() add_library(${LIB} ${LIBTYP} ${SOURCES}) target_link_libraries( ${LIB} Qt5::Core Qt5::Sql ) target_compile_definitions(${LIB} PRIVATE ${LIBDEF}) target_compile_definitions(${LIB} PUBLIC "QT_DEPRECATED_WARNINGS")
Wenn ich alle Unterprojekt aus dem Haupt CMakeLists.txt entferne, dann kann er die Build Dateien erstellen. Sobald ich das zweite (lib-db) hinzufüge kommt dieser Fehler.
Ich habe einfach mal ein leeres QtQuick Projekt erzeugt, um mir das dortige CMakeLists.txt anzuschauen. Kann aber weiter keinen Unterschied finden.Weist du wo das Problem liegen könnte?
Danke für Eure Hilfe.gruss
martin -
Oh, das sieht ja echt nach einem suboptimalen Konstrukt in Qt5AndroidSupport.cmake aus - man kann diese Datei offensichtlich nicht zweimal inkludieren (was bei Dir indirekt passiert).
Nimm bitte mal dieproject()
- Zeilen in beiden libs raus - vielleicht reicht das schon damit cmake merkt dass es die Datei schon einmal geparst hat.Siehe https://bugreports.qt.io/browse/QTBUG-87863 und der Patch hier: https://codereview.qt-project.org/c/qt/tqtc-qtbase/+/364205/2/src/corelib/Qt5AndroidSupport.cmake
-
@Christian-Ehrlicher
Danke dir für den Hinweis. das project() ausklammern hat nichts gebracht. Wenn ich auf den Link mit der Bug Solution gehe, bekomme ich nur einen 404 Error.martin
-
Du meinst mein zweiter Link geht bei dir nicht?
-
-
Ach das ist dumm. Kannst Du etwas cmake?
Wie du in https://sources.debian.org/src/qtbase-opensource-src/5.15.2+dfsg-14/src/corelib/Qt5AndroidSupport.cmake Zeile 126 ud 135 siehst wird dort ein custom target angelegt. Wird die Datei mehr als einmal inkludiert kommt es zu dem Fehler. Deshalb musst du die beiden add_custom_target() - Aufrufe jeweils mit einer Bedingung in der Formif (NOT TARGET xxx)
ausstatten so dass es nur einmal erzeugt wird. -
Ok. Danke dir für deine Hilfe. Nachdem ich das Android.cmake gepatch habe funktioniert es.
Auch mit einem Login bekomme ich auf der Seite nur ein 404.