target_compile_options() nur für C++-Dateien?

Lesezeit: 3 Minuten

Ist es möglich zu verwenden target_compile_options() nur für C++-Dateien? Ich möchte es für ein Ziel verwenden, das als Abhängigkeit für andere Anwendungen verwendet wird, damit die Bibliothek ihre Compiler-Flags an diese Apps weitergeben kann. Es gibt jedoch bestimmte Flags, wie z -std=c++14die dazu führen, dass der Build fehlschlägt, wenn sie mit C- oder ObjC-Dateien verwendet werden.

Ich habe gelesen, dass ich sollte CXX_FLAGS Stattdessen werden diese Flags nur zu C++-Dateien hinzugefügt, dies wird jedoch nicht (automatisch) durch das Paketsystem von cmake weitergegeben.

  • IIRC CXX_FLAGS kann durch Bibliothekspakete propagiert werden Präfix mit diesem Paketnamen.

    – πάντα ῥεῖ

    25. Juli 2016 um 23:21 Uhr


  • Was meinst du mit Das Paketsystem von CMake?

    – usr1234567

    26. Juli 2016 um 6:39 Uhr

Benutzer-Avatar
Florian

Lösung

Sie können dies mit tun Generatorausdrücke:

target_compile_options(MyLib PUBLIC $<$<COMPILE_LANGUAGE:CXX>:-std=c++14>)

Alternative

Aber der plattformunabhängigere Weg, dies in diesem speziellen Fall zu tun, wäre die Verwendung target_compile_features(). Ich bin mir nicht sicher welche Compiler-Funktion Sie verwenden, daher ist das Folgende nur ein Beispiel:

target_compile_features(MyLib PUBLIC cxx_explicit_conversions)

  • Großartig, Generatorausdrücke waren genau das, was ich brauchte, danke. Die target_compile_features scheinen in der Tat nett zu sein, obwohl wir aufgrund einiger Distributionen vorerst bei cmake v3.0 bleiben müssen.

    – reich.e

    26. Juli 2016 um 13:25 Uhr

  • target_compile_features kann anscheinend verwendet werden, um einfach direkt nach einer bestimmten Sprachversion nach Jahr zu fragen, ohne dass bestimmte Funktionen herausgegriffen werden müssen, die diese Version eingeführt hat: target_compile_features(someTargetName PUBLIC cxx_std_14)

    – mjwach

    13. April 2018 um 17:57 Uhr

  • Bitte legen Sie den C++-Standard nicht fest, indem Sie Compiler-Optionen manipulieren. Seit cmake 3.1 können Benutzer mit cmake den beabsichtigten Compiler-Standard über Zieleigenschaften festlegen, indem sie die CXX_STANDARD Eigentum bis 11.

    – RAM

    23. August 2018 um 10:24 Uhr

  • Auf CMake 3.12 funktioniert das für mich nur, wenn enable_language(CUDA) ist in der Präambel vorhanden.

    – Dmitri Michuschin

    8. März 2019 um 11:17 Uhr

Ich habe gelesen, dass ich stattdessen CXX_FLAGS verwenden sollte, um diese Flags nur zu C++-Dateien hinzuzufügen, dies wird jedoch nicht (automatisch) durch das Paketsystem von cmake weitergegeben.

Wenn Sie in CMake eine Funktion mit dem Präfix verwenden target_* es hat nur den Umfang eines Build-Targets. Wenn Sie möchten, dass Ihr gesamtes Projekt mit einem bestimmten Standard erstellt wird, können Sie verwenden set(CMAKE_CXX_STANDARD 14). Wenn einige der Ziele eine andere Einstellung erfordern, können Sie diese lokal mit überschreiben target vorangestellte Funktion und CXX_STANDARD Variable (der Standardwert ist ${CMAKE_CXX_STANDARD}).

Wie von RAM angegeben, ist diese Option seit v3.1 verfügbar. Aber nach zu urteilen https://repology.org/project/cmake/versions es wird bereits breit unterstützt.

Es wird auch oft darauf hingewiesen, dass man die cpp-Version nicht fix setzen sollte. Ich habe mir noch keine Meinung dazu gebildet, aber Sie können das Schlüsselwort CACHED verwenden, um es überschreibbar zu machen.

1012720cookie-checktarget_compile_options() nur für C++-Dateien?

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

Privacy policy