J'ai un projet de bibliothèque avec en-tête uniquement configuré avec la commande cmake:
add_library(my_library INTERFACE)
et j'ai aussi ajouté
target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES})
mais quand j'ouvre un fichier source, je reçois l'avertissement:
Ce fichier n'appartient à aucune cible de projet, les fonctionnalités de code insight peuvent ne pas fonctionner correctement
et je perds beaucoup de fonctionnalités sur des choses comme la complétion de code.
Quelle est la bonne façon de configurer cela afin que CLion fournisse ses fonctionnalités habituelles dans une bibliothèque contenant uniquement des en-têtes?
J'avais le même problème, bien que le projet ne soit pas en-tête uniquement, néanmoins, les fichiers ouverts du dossier inc
lançaient l'avertissement susmentionné, même si le fichier CMake indiquait clairement que ce dossier était include_directory
.
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 d’inclusion aux fichiers sources n’est pas idiomatique, je n’ai pas voulu modifier le fichier CMake.
Comme décrit sur le site officiel JetBrains Forum , le fichier CMake est en effet valide et l’avertissement est affiché en raison de l’incapacité de CLion d’indexer correctement les fichiers d’en-tête. La solution de contournement suggérée extraite du lien consiste à cliquer avec le bouton droit sur le dossier et à Mark directory as
| Library Files
/Project Sources and Headers
.
Cet en-tête ne figure donc pas dans les exécutables et CLion vous informe que certaines fonctionnalités de code insight peuvent ne pas fonctionner correctement. Pour contourner le problème, vous pouvez utiliser "Marquer le répertoire comme" Fichiers de la bibliothèque/Source du projet et En-têtes pour le dossier.
Clion prend des informations sur les fichiers source du système de génération CMake. Lorsque vous ajoutez un fichier cpp à la liste des sources, CMake indique automatiquement l’en-tête du même nom. Ainsi, si les noms cpp/h diffèrent (ou si vous n'avez pas du tout le fichier cpp), 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 sera toujours au courant des fichiers
Vous pouvez ajouter les fichiers d'en-tête à votre projet comme suit:
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)
Comme mentionné dans les commentaires, vous ne devriez probablement pas ajouter les fichiers d'en-tête à votre projet.