В CLion только библиотека заголовков: файл "не принадлежит ни одной цели проекта, функции анализа кода могут работать некорректно"
У меня есть проект библиотеки только для заголовков, настроенный с помощью команды cmake:
add_library(my_library INTERFACE)
и я также добавил
target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES})
но когда я открываю исходный файл, я получаю предупреждение:
Этот файл не принадлежит ни одной цели проекта, функции анализа кода могут работать некорректно
и я теряю много функциональности в таких вещах, как завершение кода.
Как правильно настроить этот параметр, чтобы CLion предоставлял свои обычные функции в библиотеке только для заголовков?
6 ответов
Маленький фон
У меня была такая же проблема, хотя проект был не только для заголовков, тем не менее, открытые файлы из inc
папка выдавала вышеупомянутое предупреждение, хотя файл CMake четко обозначил эту папку include_directory
,
*.hpp файлы не принадлежат ${SOURCE}
include_directories("${PROJECT_SOURCE_DIR}/inc/")
add_subdirectory(src)
add_executable(${EXECUTABLE_NAME} main.cpp ${SOURCE})
Поскольку это совершенно корректный файл CMake и добавление включаемых файлов в исходные файлы не является идиоматическим, я не хотел вносить изменения в файл CMake.
Решение
Как описано на официальном форуме JetBrains, файл CMake действительно действителен, и отображается предупреждение из-за неспособности CLion правильно индексировать заголовочные файлы. Предлагаемый обходной путь, извлеченный из ссылки, состоит в том, чтобы щелкнуть правой кнопкой мыши папку и Mark directory as
| Library Files
/ Project Sources and Headers
,
Таким образом, этот заголовок не включен в исполняемые файлы, и CLion уведомляет вас о том, что некоторые функции анализа кода могут работать некорректно. В качестве обходного пути вы можете использовать "Пометить каталог как" Библиотека файлов / Исходный код проекта и Заголовки для папки.
Clion получает информацию об исходных файлах из системы сборки CMake. Когда вы добавляете какой-либо файл cpp в список источников, CMake автоматически сообщает о заголовке с тем же именем. Поэтому, если имена cpp / h отличаются (или у вас нет файла cpp вообще), вы должны включить заголовок вручную.
set(Sources my_lib.cpp)
set(Headers header_of_my_lib.h)
add_executable(superlib ${Sources} ${Headers})
Если у вас нет исполняемого файла, вы можете пропустить последнюю строку, CLion все равно будет знать о файлах
В моем случае «Мой проект» — это проект Makefile. Я переименовал файл .c, и CLion сообщил мне, что этот файл не принадлежит ни одному проекту. Итак, причина в том, что индекс не актуален. После того, как я выполнил «очистку и перезагрузку проекта Makefile», сообщение исчезло автоматически. Шаги следующие:
- Откройте окно инструмента «Создать» из Главного меню->Вид->Окна инструментов->Создать.
- Нажмите «Очистить и перезагрузить проект Makefile».
Сделанный.
Вы можете добавить файлы заголовков в ваш проект следующим образом:
set(SOURCE_FILES main.cpp MyClass1.cpp MyClass1.h MyClass2.cpp MyClass2.h)
Вы также можете установить его в несколько шагов, например:
set(SOURCE_FILES main.cpp)
set(SOURCE_FILES ${SOURCE_FILES} MyClass1.cpp MyClass1.h)
set(SOURCE_FILES ${SOURCE_FILES} MyClass2.cpp MyClass2.h)
Хотя, как уже упоминалось в комментариях, вам, вероятно, вообще не следует добавлять файлы заголовков в ваш проект.
Это предупреждение связано с проблемой IDE: Android Studio не может распознать текущий каталог, если он не содержит исходных файлов .
Обходной путь
Добавление пустого исходного файла, например
empty_xxx.c
в соответствующем каталоге и добавив строку ниже в соответствующий
CMakeList.txt
add_library(${TARGET_NAME_XXX} SHARED ${SOME_DIR_HAVING_THIS_WARNING}/empty_xxx.c)
поможет избавиться от этого предупреждения.