3.8 KiB
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:
-
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
-
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
-
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