Ich arbeite an einer größeren C++ - Bibliothek, die CMake verwendet und hängt von Qt. Wir sind von Qt4 zu Qt5 gewechselt und jetzt stoße ich auf ein Problem, wenn wir unsere lib in einem Upstream-Projekt verwenden. Als minimales Beispiel arbeiten, das Problem demonstriert bitte einen Blick auf dieses Repo:CMake Paket Konfigurationsdateien für Upstream-Projekte mit Qt5 Probleme
https://github.com/philthiel/cmake_qt5_upstream
Es enthält zwei getrennte CMake Projekte:
MyLib: eine winzige Bibliothek, die QString von QT5 verwendet: :Ader.
Es erzeugt und installiert Paket Konfigurationsdateien MyLIBConfig.cmake, MyLIBConfigVersion.cmake und MyLIBTargets.cmake um durch CMake find_package durchsuchbar zu sein()
myApp: ein winzige ausführbare abhängig von MyLib
Das Projekt verwendet find_package (MyLib) und erstellt eine ausführbare Datei, die verwendet MyLib
Das Problem ist, dass CMake mir die folgende Fehlermeldung gibt, wenn das Projekt MeineAnw konfigurieren:
istCMake Error at CMakeLists.txt:11 (add_executable):
Target "MyAPP" links to target "Qt5::Core" but the target was not found.
Perhaps a find_package() call is missing for an IMPORTED target, or an
ALIAS target is missing?
Der Grund für dieses Verhalten, das in der automatisch generierte MyLIBTargets.cmake den INTERFACE_LINK_LIBRARIES Eintrag Datei für QT5 Core ist die QT5 :: Kernsymbol Mit Qt4 wurde hier der absolute Pfad zur Qt-Core-Lib angegeben.
Jetzt kann ich einfach dieses Problem zu beheben, indem
find_package(Qt5Core 5.X REQUIRED)
im myApp Projekt mit.
Allerdings würde ich gerne wissen, ob dies der beabsichtigte/generische Weg ist, dh Upstream-Projekte unserer lib anfragen, um die erforderlichen transitiven Qt5-Abhängigkeiten selbst zu suchen, oder wenn ich CMake hier wahrscheinlich missbrauche und ändern muss meine Konfigurationsprozedur?
Die CMake Doku auf Paketdatei Generation
https://cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html
erwähnt, dass Makros können durch die Paket-Konfigurationsdateien bereitgestellt werden, um den Strom. Vielleicht ist dies der richtige Ort, um nach importierten Zielen wie Qt5 zu suchen und Upstream-Konfigurationsläufe zu unterbrechen, wenn diese Abhängigkeiten nicht gefunden werden?
Best, Philipp
Vielen Dank für die schnelle Antwort !! Die ausführbare Datei war nur ein Beispiel. Um Ihnen Recht zu geben, stelle ich tatsächlich ein benutzerdefiniertes Find-Modul oder entsprechende Makros mit meinen Bibliothekspaket-Konfigurationsdateien zur Verfügung, die nach transitiven Abhängigkeiten suchen und einen Fehler ausgeben, wenn der Upstream nach meiner Lib sucht und diese Abhängigkeiten nicht gefunden werden können? – philt
ja, du musst. –
Entschuldigung, ich drücke Enter, bevor ich fertig geschrieben habe. Ich aktualisiere die Antwort mit einem vollständigen Beispiel, wie ich damit umgehen soll. –