2017-10-05 1 views
0

J'essaie de faire en sorte que ma bibliothèque cible dépende de C++ 14. Comment puis-je atteindre, que les cibles, ce lien avec ma cible de bibliothèque dépendent également de C++ 14?La bibliothèque CMake make nécessite la norme cxx

J'ai essayé d'utiliser:

add_library(lib SHARED ${FILES}) 
target_compile_options(lib INTERFACE CXX_STANDARD 14) 

Cela fonctionne pour construire la bibliothèque, mais lorsque je tente de compiler d'autres cibles à l'aide lib 14 C++ n'est pas activé. Je suis conscient qu'il existe d'autres méthodes, mais je n'arrive pas à les faire fonctionner. A savoir il y a:

set_target_properties() 

La raison est que les en-têtes de bibliothèque utilisent capture généralisées lambda et les alias modèle comme std::remove_reference_t et similaires, qui sont dans la bibliothèque standard depuis C++ 14.

+0

Ainsi, si d'autres cibles utilisent cette bibliothèque, elles utilisent de facto également C++ 14. Que diriez-vous de spécifier directement la norme C++ sur eux alors? Il serait étrange que le simple fait d'utiliser une bibliothèque ait pour effet secondaire de changer la langue même que votre programme utilise. – spectras

+0

C'est ce que je fais pour l'instant, mais je pense qu'il y a des manières plus élégantes dans les récentes versions de 'cmake'. Les cibles cuda et mpi parviennent à définir plusieurs indicateurs automatiquement. – OutOfBound

+0

Votre bibliothèque contient des fichiers .h ou hpp qui sont compilés par les utilisateurs. Vérifiez le niveau de compatibilité nécessaire ici. – ddbug

Répondre

2

Ce que vous cherchez (version CMake> = 3.8) est le suivant:

target_compile_features(lib PUBLIC cxx_std_14) 

ou, avec les versions CMake 3.1 ci-dessus, en spécifiant explicitement les fonctionnalités dont vous avez besoin, fi:

target_compile_features(lib PUBLIC cxx_alias_templates) 

La syntaxe que vous avez utilisée est incorrecte pour définir la norme requise. Comme une remarque de côté, PUBLIC est utilisé au lieu de INTERFACE puisque vous voulez également compiler la bibliothèque avec C++ 14.

Plus de détails dans le docs.

+1

On dirait qu'il aura besoin de ceci et de son CMake existant car il semble que son code utilise 'CXX_STANDARD' pour compiler conditionnellement les variantes de code. – legalize