Задать вопрос
@Drovosek01

Как настроить clangd на видимость всех файлов, чтобы не указывать относительные пути в include?

Недавно начал осваивать C++
Пишу проект, который в конечном итоге компилируется в библиотеку .dylib
Пробовал использовать VS Code для написания, но он показывает какие-то странные ошибки (вроде в синтаксисе), исправить которые мне так и не получилось и я перешел на использование Sublime Text + LSP Clangd

Изначально все исходники (.h и .cpp файлы) были в папке src, но я решил разбить их по логическим группам/директориям.
Вот что в итоге папке с проектом:
 % tree
.
├── build.sh
└── src
    ├── common
    │   ├── common.cpp
    │   ├── common.h
    │   ├── crypt_utils.h
    │   └── debug_log.h
    ├── libpattern_scanner.dylib
    ├── macho
    │   ├── dyld_cache.cpp
    │   ├── dyld_cache.h
    │   ├── fat_slice.cpp
    │   ├── fat_slice.h
    │   ├── image_scanner.cpp
    │   └── image_scanner.h
    ├── main.cpp
    ├── patching
    │   ├── hex_patch_module.cpp
    │   ├── hex_patch_module.h
    │   ├── patch_manager.cpp
    │   ├── patch_manager.h
    │   ├── symbol_patch_module.cpp
    │   └── symbol_patch_module.h
    ├── pattern
    │   ├── pattern.cpp
    │   └── pattern.h
    ├── platform
    │   ├── simd_caps.cpp
    │   └── simd_caps.h
    ├── scanning
    │   ├── bmh_search.cpp
    │   ├── bmh_search.h
    │   ├── pattern_scanner.cpp
    │   ├── pattern_scanner.h
    │   ├── simd_search.cpp
    │   └── simd_search.h
    └── search
9 directories, 29 files


Вот содержимое файла .clangd:
CompileFlags:
  Add:
    - -Isrc/common
    - -Isrc/macho
    - -Isrc/patching
    - -Isrc/pattern
    - -Isrc/platform
    - -Isrc/scanning
    - -Isrc/search
    - -xc++
    - "-std=c++17"
    - -Wall
    - -Wshadow

Diagnostics:
  ClangTidy:
    Add:
      - bugprone-*
      - cert-*
      - modernize-*
      - performance-*
      - readability-*
      - cppcoreguidelines-*
    Remove:
      - bugprone-easily-swappable-parameters
    FastCheckFilter: none


Я не уверен, что структура проекта останется такой, поэтому я не хочу в инклудах в .cpp-файлах указывать относительные пути.
Хочу, чтобы #include остались как были изначально - указывались только названия header-файлов с их расширением и, вроде бы текущее содержимое файла .clangd должно решать эту проблему.

Но когда я открываю файл main.cpp, то вот его первые строки:
#include "debug_log.h"
#include "pattern.h"
#include "hex_patch_module.h"
#include "patch_manager.h"
#include "common.h"
#include "dyld_cache.h"
#include "crypt_utils.h"
#include "symbol_patch_module.h"

#include <iostream>
#include <mach-o/dyld.h>
#include <mach-o/loader.h>
#include <mach/mach.h>
#include <mach/vm_map.h>

#include <cctype>
#include <cstring>
#include <string>
#include <vector>

#include <fcntl.h>
#include <mach-o/fat.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

#include <libkern/OSCacheControl.h>

__attribute__((constructor)) static void
init()
...


На первой же строки я получаю ошибку
'debug_log.h' file not found (clang[pp_file_not_found])
Если вместо
#include "debug_log.h"
я напишу
#include "common/debug_log.h"
то ошибка уйдет, но, как я указал выше - я не хочу прописывать пути ко всем .h-файлам

Вопрос:
Как настроить clangd, чтобы оставить код в текущем виде и clangd понимал что и откуда подключается и не выдавал ошибок?

Пробовал решать проблему через нейронки
Но они пишут, что у меня в файле .clangd и так все норм и проблем быть не должно

Вот исходники проекта - https://mega.nz/file/ZnoBgQSQ#W2-GIha8Kee7trrvsMtr...
Все происходит на macOS 15 ARM
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Stepik
    Профессия: Разработчик C++ (Junior)
    2 месяца
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
пути в .clangd CompileFlags считаются относительно cwd при запуске clangd, не от директории самого .clangd — это known issue. Нормальный фикс: brew install bear &amp;&amp; bear -- ./build.sh, получишь compile_commands.json с абсолютными путями, clangd подхватит всё сам.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы