Files
qt6-migration-pipeline/prompts/fix-strictly-only-remaining-linker-errors-undefined-refs.prompt.md

3.8 KiB

Behebe strikt nur die verbleibenden Linker-Fehler ("undefined reference") im Docker-Build der Qt6-Migration.

Kontext:

  • arbeite ausschließlich Docker-basiert
  • maßgeblich ist: qt-migration-legatus/qt6-after/qt6-migrated-legatus/docker_build.sh
  • Repo ist im Container gemountet; Mount-Punkt kann /workspace ODER /repo sein
  • keine hartkodierten Annahmen auf /workspace, wenn /repo möglich ist
  • aktueller Build:
    • ubuntu:26.04
    • build4
    • BUILD_RTI=ON
    • BUILD_ARCGIS=OFF
    • CMAKE_CXX_STANDARD=17
    • RTI Connext 7.7.0
  • aktuelle DDS-Targets: ddscore ddsftccore ddsQoS ddsconnector ddsfts

Betroffene Codegen-Dateien:

  • qt-migration-legatus/qt6-after/qt6-migrated-legatus/cmake/MacroCodeGenIdl.cmake
  • qt-migration-legatus/qt6-after/qt6-migrated-legatus/cmake/MacroRTIDDSGen.cmake

Wichtige Invarianten:

  • .idl-Dateien werden generiert und entstehen in Build-Ordnern
  • generierte .idl-Dateien dürfen NUR aus Build-Ordnern für weitere Verarbeitung zu .h/.cpp/.cxx verwendet werden
  • durch Codegen erzeugte .h/.cpp/.cxx dürfen ebenfalls NUR in Build-Ordnern entstehen
  • generierte Dateien dürfen nicht in den Source-Tree geschrieben oder von dort eingebunden werden

Fehlerbild: Target svcTabCommon scheitert beim Linken von tab.cxx.o / tab_json.cpp.o mit undefined references auf Typen aus fremden IDL-Modulen, u. a.:

  • Core::GeoPosition, GeoPosition2D, GeoPositionRelativeTime, Orientation, RelativePosition
    • Default-Ctor
    • operator==
    • operator!=
    • operator<<
    • swap
  • ProjectDataManagement::* operator<<
    • z. B. L27_EffectorId, L28_Status, VulnerabilityState, WphMode, UasState
  • rti::topic::dynamic_type<...>::get()
  • dds::topic::topic_type_support<...>::reset_sample / allocate_sample

Aufgabe:

  1. Root Cause ermitteln:

    • TrainingAreaBase/tab.idl referenziert Typen aus Core und ProjectDataManagement
    • deren generierte RTI-/DDS-Sourcen werden vermutlich nicht erzeugt, nicht kompiliert oder nicht an svcTabCommon gelinkt
  2. Prüfen:

    • Zusammenspiel/Reihenfolge von MacroCodeGenIdl.cmake und MacroRTIDDSGen.cmake
    • rtiddsgen-Aufrufe
    • IDL-Include-Pfade: müssen auf Build-Ordner zeigen, nicht Source-Tree
    • tatsächlich erzeugte Dateien in build4
    • add_library / target_sources / target_link_libraries
    • Link-Reihenfolge und Target-Abhängigkeiten
    • C++-Codegen-Modus und ABI: C++11/Modern C++ vs. alter Modus
    • einheitlicher CMAKE_CXX_STANDARD=17
    • ob /workspace-vs-/repo-Pfade Codegen, Includes oder Linking beschädigen
  3. Minimal beheben:

    • fehlende generierte Quellen im Build-Ordner erzeugen
    • fehlende generierte Quellen den richtigen Targets hinzufügen
    • fehlende Bibliotheken/Targets korrekt an svcTabCommon linken
    • Target-Abhängigkeiten so setzen, dass Core/ProjectDataManagement vor TrainingAreaBase verfügbar sind

Verbote:

  • keine Workarounds
  • kein --allow-shlib-undefined
  • kein -Wl,--unresolved-symbols
  • keine Stub- oder Dummy-Implementierungen
  • keine generierten Artefakte im Source-Tree
  • keine Refactorings
  • keine Opportunitäts-Fixes
  • nichts im Legacy-Tree ändern
  • keine IDL-Quellen ändern, außer sie sind nachweislich Root Cause

Scope:

  • docker_build.sh
  • app/Dockerfile nur falls zwingend nötig
  • MacroCodeGenIdl.cmake
  • MacroRTIDDSGen.cmake
  • direkt ursächliche CMakeLists/CMake-Dateien für Codegen und Linking der betroffenen Proxies

Validierung:

  • Docker-Build erneut ausführen
  • Link-Stage prüfen
  • bestätigen, dass die genannten undefined references verschwunden sind
  • mit nm + c++filt stichprobenartig prüfen, dass zuvor fehlende Symbole nun in gelinkten Objekten/Libraries vorhanden sind
  • prüfen, dass keine generierten .idl/.h/.cpp/.cxx im Source-Tree entstanden sind
  • wenn praktikabel: Build mit /workspace und /repo Mount-Punkt testen

Abschlussbericht kurz:

  • behoben / teilweise behoben
  • Root Cause
  • geänderte Dateien
  • exakte Docker-Kommandos
  • verbleibende Fehler oder Blocker