Verwenden von CMake mit mehreren Compilern für dieselbe Sprache

Lesezeit: 3 Minuten

Es scheint, als ob CMake in seiner Ansicht fest verankert ist, dass es einen und nur einen CMAKE_CXX_COMPILER für alle C++-Quelldateien geben sollte. Ich kann keine Möglichkeit finden, dies pro Ziel zu überschreiben. Dies macht eine Mischung aus Host- und Cross-Kompilierung in einer einzigen CMakeLists.txt mit den integrierten CMake-Funktionen sehr schwierig.

Meine Frage lautet also: Was ist der beste Weg, mehrere Compiler für dieselbe Sprache (dh C++) zu verwenden?

Mit CMake ist das nicht möglich.

CMake behält nur einen Satz von Compiler-Eigenschaften bei, der von allen Zielen in einer CMakeLists.txt-Datei geteilt wird. Wenn Sie zwei Compiler verwenden möchten, müssen Sie CMake zweimal ausführen. Dies gilt beispielsweise sogar für das Erstellen von 32-Bit- und 64-Bit-Binärdateien aus derselben Compiler-Toolchain.

Der schnelle und schmutzige Weg, dies zu umgehen, ist die Verwendung benutzerdefinierter Befehle. Aber dann landen Sie im Grunde bei verherrlichten Shell-Skripten, was wahrscheinlich nicht das ist, was Sie wollen.

Die saubere Lösung ist: Fügen Sie sie nicht in die gleiche CMakeLists.txt ein! Sie können sowieso keine Verknüpfungen zwischen verschiedenen Architekturen herstellen, sodass sie sich nicht in derselben Datei befinden müssen. Sie können Redundanzen reduzieren, indem Sie gemeinsame Teile der CMake-Skripte in separate Dateien umgestalten und include() Sie.

Der Hauptnachteil hier ist, dass Sie die Fähigkeit verlieren, mit einem einzigen Befehl zu bauen, aber Sie können das lösen, indem Sie einen Wrapper in Ihrer bevorzugten Skriptsprache schreiben, der sich um den Aufruf der verschiedenen CMake-Makefiles kümmert.

  • Scheint, als wäre add_directory(other_build_kind_folder) auch eine Möglichkeit, im Gegensatz zum Erstellen eines benutzerdefinierten Wrappers, da ich das getan habe und es zu funktionieren scheint. 🙂

    – klar

    4. März 2012 um 17:51 Uhr

  • @cdleary Könnten Sie erklären, wie das funktioniert? Wie funktioniert add_subdirectory (oder meinst du wirklich add_directory?) ermöglichen es Ihnen, Toolchains zu wechseln?

    – Kyle Strand

    27. April 2015 um 21:56 Uhr


  • Größtenteils richtig, aber es gibt Techniken, um CMake so zu manipulieren, dass es sowohl einen Host- als auch einen Toolchain-Satz von Compilern verwendet, die von einem Build gesteuert werden. Sehen Sie sich diese Frage und Antwort für ein ähnliches Szenario an, das ich seit einiger Zeit erfolgreich in einigen realen Projekten verwende. @Bills Antwort, die ExternalProject empfiehlt, ist ebenfalls ein guter Rat.

    – Craig Scott

    16. Juli 2016 um 2:46 Uhr

  • @ComicSancMs Ich bin mit der Begründung des 3. Absatzes überhaupt nicht einverstanden. In der Tat können Sie nicht mit verschiedenen Architekturen verknüpfen, aber das ist nicht der einzige Grund, verschiedene C ++ – Compiler zu haben, die ich zum Beispiel früher verwendet habe Tempellicht Da ein Wrapper für Clang und Ccache auch ein Compiler-Wrapper ist, zählen diese beiden Projekte als unterschiedliche Compiler, aber es gibt nur verschiedene Tools, die Sie grundsätzlich nach Belieben für beliebige separate cpp-Dateien verwenden können

    – Spyros Mourelatos

    9. Februar 2021 um 12:44 Uhr

  • In VS ist es in Ordnung, eine Lösung mit sogar statischen Bibliotheksprojekten zu haben, die mit verschiedenen Compilern kompiliert wurden. Weil sie alle binärkompatibel sind. Compiler sind VC, Intel, Clang. Sie verwenden alle dieselbe VC-STL. Entwickelt, um binärkompatibel zu sein.

    – Антон Сергунов

    12. Oktober 2021 um 3:23 Uhr


Benutzer-Avatar
Bill Hoffmann

Vielleicht möchten Sie sich ExternalProject ansehen:
http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html

  • Der Link leitet jetzt zu einer PDF um, die ExternalProject nicht zu erwähnen scheint.

    – dOxxx

    22. Februar 2021 um 16:38 Uhr

Um die Antwort von @ Bill Hoffman zu erweitern: Erstellen Sie Ihr Projekt als Super-Build, indem Sie eine Art Vorlage wie die hier verwenden https://github.com/Sarcasm/cmake-superbuild
Dadurch werden sowohl die Abhängigkeiten als auch Ihr Projekt als ExternalProject (eigenständige cmake-Konfigurations-/Build-/Installationsumgebung) konfiguriert.

1013110cookie-checkVerwenden von CMake mit mehreren Compilern für dieselbe Sprache

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy