84 votes

Dans CLion, la bibliothèque d'en-tête uniquement : le fichier "n'appartient à aucune cible du projet, les fonctionnalités d'aperçu du code peuvent ne pas fonctionner correctement".

J'ai un projet de bibliothèque à en-tête seul configuré avec la commande cmake :

add_library(my_library INTERFACE)

et j'ai également ajouté

target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES})

mais quand j'ouvre un fichier source, j'obtiens l'avertissement :

Ce fichier n'appartient pas à la cible d'un projet, les fonctions d'aperçu du code peuvent ne pas fonctionner correctement.

et je perds une grande partie de la fonctionnalité sur des choses comme la complétion de code.

Quelle est la bonne façon de configurer cela pour que CLion fournisse sa fonctionnalité habituelle sur une bibliothèque à en-tête seulement ?

124voto

sjaustirni Points 1487

Petit historique

J'ai eu le même problème, bien que le projet ne soit pas en-tête seulement, néanmoins, les fichiers ouverts de inc lançaient l'avertissement susmentionné, même si le fichier CMake indiquait clairement que ce dossier était include_directory .

Les fichiers *.hpp n'appartiennent pas à ${SOURCE}

include_directories("${PROJECT_SOURCE_DIR}/inc/")
add_subdirectory(src)
add_executable(${EXECUTABLE_NAME} main.cpp ${SOURCE})

Comme il s'agit d'un fichier CMake parfaitement valide et que l'ajout des fichiers include aux fichiers sources n'est pas idiomatique, je n'ai pas voulu modifier le fichier CMake.

La solution

Comme décrit sur le site officiel Forum JetBrains Le fichier CMake est en effet valide et l'avertissement est affiché en raison de l'incapacité de CLion à indexer correctement les fichiers d'en-tête. La solution de contournement suggérée, extraite du lien, est la suivante cliquez avec le bouton droit de la souris sur le dossier et Mark directory as | Library Files / Project Sources and Headers .

Ainsi, cet en-tête n'est pas inclus dans les exécutables et CLion vous notifie que certaines fonctionnalités d'aperçu du code pourraient ne pas fonctionner correctement. Comme solution de rechange, vous pouvez utiliser "Marquer le répertoire comme" Library Files/Project Source and Headers pour le dossier.

1 votes

Vous pouvez faire mieux si cela ne vous dérange pas de sacrifier la possibilité de construire en utilisant Clion (je suis heureux de construire en ligne de commande et d'avoir une indexation correcte dans Clion). CLion fournit un CLION_IDE à cmake, afin de pouvoir ajouter des fichiers d'en-tête au tableau des sources. if ($ENV{CLION_IDE}) Ce qui permet à Clion de tout indexer correctement (mais vous empêche d'utiliser la version intégrée de Clion).

1 votes

Notamment : "Marquer comme sources du projet" ne traitera pas correctement les choses comme les répertoires d'inclusion.

1 votes

@ChrisKitching Mais alors vous avez des choses spécifiques à CLion dans votre fichier CMake tout en utilisant la ligne de commande de toute façon. À ce stade, vous pourriez aussi bien abandonner le fichier CMake entièrement et juste utiliser Makefile ou tout faire en ligne de commande. De plus, je n'ai jamais rencontré de comportement inapproprié en utilisant la ligne de commande. Mark directory as Project Sources and Headers . Qu'est-ce qui vous posait problème exactement ?

3voto

Valdemar Points 49

Clion prend des informations sur les fichiers sources à partir du système de construction CMake. Lorsque vous ajoutez un fichier cpp à la liste des sources, CMake vous informe automatiquement de l'existence d'un en-tête portant le même nom. Donc si les noms de cpp/h diffèrent (ou si vous n'avez pas de fichier cpp du tout) vous devez inclure l'en-tête manuellement.

set(Sources my_lib.cpp)
set(Headers header_of_my_lib.h)
add_executable(superlib ${Sources} ${Headers})

Si vous n'avez pas d'exécutable, vous pouvez omettre la dernière ligne, CLion connaîtra toujours les fichiers.

8 votes

Veuillez cesser d'ajouter des fichiers d'en-tête à l'exécutable. La solution de contournement pour ce bogue de JetBrains est décrite dans ma réponse.

1 votes

@sjaustirni CMake ne s'embrouille pas. Il a été argumenté ( Bahadir, Réunion C++ 2019 ) que les fichiers d'en-tête doivent toujours être inclus dans l'exécutable. Si rien d'autre, cela signifie que l'IDE de l'utilisateur obtient la bonne réponse quand il interroge CMake pour les fichiers sources.

0 votes

@cz Je n'ai certes pas regardé la conférence, mais vous n'avez pas besoin d'inclure les fichiers d'en-tête dans l'exécutable pour que votre IDE comprenne votre base de code et obtienne Intellisense. Si vous regardez ma réponse à cette question, vous pouvez voir comment cela peut être fait sans polluer vos cibles CMake avec les fichiers d'en-tête.

0voto

shizhen Points 2702

Cet avertissement est un problème de l'IDE : Android Studio ne peut pas reconnaître le répertoire actuel. s'il n'inclut aucun fichier source .

Solution de rechange

Ajout d'un fichier source vide, par ex. empty_xxx.c sous le répertoire en question et en ajoutant la ligne ci-dessous dans votre correspondance CMakeList.txt

add_library(${TARGET_NAME_XXX} SHARED ${SOME_DIR_HAVING_THIS_WARNING}/empty_xxx.c)

vous aidera à vous débarrasser de cet avertissement.

0 votes

Avez-vous essayé la réponse acceptée ? N'a-t-elle pas fonctionné ? Vous ne devriez pas avoir besoin de solutions de contournement de cmake pour cela.

0 votes

Oui, j'ai essayé, mais ça n'a pas marché pour moi.

2 votes

Pour être plus précis, je ne vois pas d'option Mark directory as | Library Files/Project Sources and Headers

-1voto

Noni A. Points 149

Vous pouvez ajouter les fichiers d'en-tête à votre projet comme ceci :

set(SOURCE_FILES main.cpp MyClass1.cpp MyClass1.h MyClass2.cpp MyClass2.h)

Vous pouvez également le définir en plusieurs étapes, comme suit :

set(SOURCE_FILES main.cpp)
set(SOURCE_FILES ${SOURCE_FILES} MyClass1.cpp MyClass1.h)
set(SOURCE_FILES ${SOURCE_FILES} MyClass2.cpp MyClass2.h)

Bien que, comme mentionné dans les commentaires, vous ne devriez probablement pas ajouter les fichiers d'en-tête à votre projet du tout.

1 votes

SOURCE_FILES est-elle une variable magique dans cmake ? Je ne vois pas de documentation à ce sujet.

0 votes

Il est mentionné aquí .

0 votes

Cela ne signifie pas que SOURCE_FILES soit une variable importante à définir du point de vue de cmake.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X