Ich habe eine Header-C ++ 11-Bibliothek, also möchte ich sie mit CMake & gt; 3.1, kompilieren Funktionen scheint ein vernünftiger Weg, dies zu tun:
%Vor%Aber ich würde es vorziehen, nicht einzelne Merkmale angeben zu müssen, sondern nur C ++ 11 oder C ++ 14. Dann könnte ich versuchen, Folgendes zu verwenden:
%Vor%Das Problem ist, dass my_target hier nicht INTERFACE sein kann, es wird nicht unterstützt, und ich kann es nicht PUBLIC definieren, so dass Verbraucher (viele EXEs) meiner Header-only-Bibliothek automatisch die C ++ 11-Konfiguration von der lib propagieren lassen.
Gibt es eine Möglichkeit, einen 11/14 Standard auf hoher Ebene zu definieren, aber auch für eine Header-Bibliothek (INTERFACE) zu konfigurieren? Ich würde es vorziehen, nicht auf das alte Handbuch -std = c ++ 11 zurückzugreifen.
CMake 3.8 (veröffentlicht im April 2017) führte Meta-Features ein (zB < stark> cxx_std_11 , cxx_std_14 , cxx_std_17 ). Sie können jetzt zum Beispiel schreiben:
%Vor% Die einfachste Lösung für den Augenblick besteht darin, Listen von C ++ 11- und C ++ 14-Features in einer globalen Variablen manuell zu verwalten und diese Liste an target_compile_features
zu füttern.
Vielleicht wäre es schön, wenn CMake diese Listen bereits für Sie bereitgestellt hätte, aber derzeit nicht.
Beachten Sie, dass dies konsistent ist mit dem Mechanismus zum Kompilieren von Features in CMake. Die Eigenschaft CXX_STANDARD
bestimmt, welches Flag dem Compiler in der Befehlszeile übergeben wird. Nur weil Sie eine bestimmte Standardversion anfordern, kann jedoch nicht garantiert werden, dass eine bestimmte Funktion korrekt kompiliert wird. Die einzige Möglichkeit, sicherzustellen, dass ein bestimmtes Feature vorhanden ist (und mit einem sinnvollen Fehler fehlschlägt, wenn dies nicht der Fall ist), besteht darin, es durch target_compile_features
zu überprüfen.
Die Komplikation hier ist wirklich nicht darauf zurückzuführen, wie CMake die Dinge handhabt, sondern aufgrund der Tatsache, dass verschiedene Compiler unterschiedliche Teilmengen des Standards implementieren.