Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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?

    6625edc7-c4ae-45df-86af-292d1b73a6a3-grafik.png

    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


  • Lifetime Qt Champion

    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 die project() - 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


  • Moderators

    @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

    af294975-2ed1-4cb4-b133-77a6aecf8d4d-image.png

    wenn du schon da bist, stelle sicher, dass die Checkbox "Shadow build" gecheckt ist, sollte deinen Fehler beheben

    849374e4-ab9d-48c6-a784-dd3e5c5847e5-image.png



  • 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


  • Lifetime Qt Champion

    Du hast zwei executables/libraries mit denselben namen (aab) - das wird nicht unterstützt



  • Wo kommt das her? Was das mit dem AAB ist, habe ich keine Ahnung. Wenn ich Qt 15.12.2 für Android auswähle, bekomme ich diese Probleme nicht.


  • Lifetime Qt Champion

    Das muss von deinen CMake-files kommen


  • Moderators

    @J-Hilk said in Problems Qt 5.15.2 / cmake and Android project:

    @msauer75

    849374e4-ab9d-48c6-a784-dd3e5c5847e5-image.png

    ist der Harken gesetzt?
    weil die Meldung

    The existing target is a custom target created in source directory

    lässt mich glauben das du ein in source build machst.



  • @Christian-Ehrlicher

    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


  • Lifetime Qt Champion

    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 die project() - 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


  • Lifetime Qt Champion

    Du meinst mein zweiter Link geht bei dir nicht?




  • Moderators

    @msauer75

    auf der Seite, oben rechts steht da login ?

    wenn ja, log dich ein, mit dem selben Daten wie auch hier im Forum.

    Schau mal, ob es dann angezeigt wird


  • Lifetime Qt Champion

    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 Form if (NOT TARGET xxx) ausstatten so dass es nur einmal erzeugt wird.



  • @Christian-Ehrlicher

    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.


Log in to reply