Индексатор CLion не разрешает некоторые включения в каталог проекта

У меня есть проект CLion C++ со следующей структурой:

    project
       ---->my_includes
       |   ----> my_own.hpp
       ---->source
           ----> my_app
               ----> my_src.cpp

Первая строка my_src.cpp:

#include "my_includes/my_own.hpp"

Я использую внешнюю систему сборки, для которой требуется этот формат включения. Проблема в том, что если я использую функцию в моем исходном файле, определенную во включенном заголовке, CLion говорит: «Не удается найти my_own.hpp», если я пытаюсь навести курсор на включение.

Я попытался пометить каталог include как содержащий исходный код проекта или заголовки, но это не помогло. Любые идеи?


person CPayne    schedule 23.03.2016    source источник
comment
Опубликуйте свой CMakeLists.txt   -  person Tamás Szelei    schedule 24.03.2016


Ответы (2)


Вам нужно создать CMakeLists.txt, чтобы CLion был счастлив. Достаточно объявить все исходники, вам не нужно конвертировать свои scons (или любую другую систему сборки) в cmake.

Вам даже не нужно писать CMakeLists.txt вручную, вы можете попросить CLion сделать это:

  • File | New CMake Project from Sources... (начиная с CLion 2019.2)
  • File | Import project ... | (старший CLion)

а затем укажите каталог, содержащий ваш проект.

Теперь отредактируйте сгенерированный CMakeLists.txt и добавьте команду cmake, чтобы указать CLion, где найти включения (на самом деле, чтобы сообщить компилятору, и CLion повторно использует эту информацию).

Поскольку ваши исходные файлы используют включение как #include "my_includes/my_own.hpp", вам нужно указать cmake базовый каталог, содержащий каталог my_includes:

include_directories(.)

Где точка означает тот же каталог, что и тот, который содержит CMakeLists.txt.

Я протестировал проект, воспроизводящий ваш макет, и с my_src.cpp я могу перейти к my_own.hpp.

Тогда для сборки вам все равно придется использовать scons в консоли. Также можно добавить команду cmake, add_custom_target(), которая будет вызывать ваши scons (или вашу make, или что-то еще), чтобы вы также могли переходить от CLion к ошибкам сборки.

person marco.m    schedule 24.03.2016
comment
У меня была похожая проблема, include_directories было то, что мне было нужно. Мне пришлось добавить несколько разных, но теперь он отлично работает. - person njfife; 14.06.2017
comment
начиная с CLion 2019.2 этот параметр называется File | New CMake Project from Sources... - person ikamen; 17.09.2019
comment
Возможно, потребуется сборка, прежде чем включенные каталоги будут синхронизированы и распознаны. Я смог перейти к этим заголовкам только после сборки. - person Ilia Barahovski; 25.12.2019

Это должен быть проект на основе CMake, чтобы он правильно открывался в CLion. Ознакомьтесь с руководством по основам CMake, если вы не знакомы с CMake: https://www.jetbrains.com/help/clion/2016.1/quick-cmake-tutorial.html

person nastasiak2512    schedule 24.03.2016
comment
Таким образом, хотя я не использую CMake для своей сборки (только SCONS), наличие проекта CMake — единственный способ, с помощью которого CLion узнает, где искать определенный файл? - person CPayne; 24.03.2016
comment
Да, так что если говорить о том, как CLion использует CMake, то выделим всего пару примеров: 1. Когда кодогенерация работает, мы проверяем наличие фичи в компиляторе, вроде директивы override — CLion предложит вам эту галочку только в случае, если компилятор со всеми параметрами, установленными в вашем CMake, поддерживает его. Это означает, по крайней мере, C++11, и версия компилятора, конечно же, должна его поддерживать. 2. Рефакторинг переименования, он проверяет использование реального контекста, а не использования текста. - person nastasiak2512; 04.08.2016
comment
Для этого CLion должен много знать о вашем коде. И это зависит от многих вещей: исходных файлов проекта, включенных заголовков и путей поиска заголовков, флагов компилятора, используемого тулчейна и платформы, предустановленных макросов компилятора и еще кое-чего. Таким образом, CLion анализирует вашу модель проекта CMake, чтобы извлечь оттуда всю эту информацию, а затем использует ее для синтаксического анализа, разрешения и других функций. - person nastasiak2512; 04.08.2016