【経緯】
Neovim上でC/C++のコードを書いている時に、独自ヘッダファイルがNot Foundになったので原因を調べました。いまさら感は拭えないですが、解決しないとコード補完ができなくて困るので、とりあえずNot Foundエラーを消すところまでを簡単にまとめます。
【環境】
O S | Pop!_OS 22.04 LTS |
Neovim | v.0.10.0 |
GitHub | メインプロジェクト + サブモジュール |
言 語 | C / C++ |
とりあえず、GitHubのリポジトリでサブモジュール登録の仕方については、[GitHub公式]が細かく解説してあってわかりやすいので、サブモジュールの使い方に詳しくない人は一度見てみると良いと思います。
Neovimのコード補完については、Neovim+LSPを設定&使用しています。
そういえば、独自ヘッダがNot Foundになる前に、 標準ライブラリでもエラー "'iostream' file not found" になっていたので、解決法を。
- $ sudo apt install gcc-12
+ $ sudo apt install g++-12
これで、C++の標準ライブラリファイルがインストールされます。
おっきな勘違いしてたのだけど、コンパイラがClang++だろうが、g++だろうが、同じ標準ライブラリを見にいくんですね。よく考えてみればそりゃそっか、なんだけど、最初のうちはてっきりそれぞれ違う標準ライブラリファイルを見にいくんだと思っていました。
さて、次に本題の独自ヘッダファイルのNot Foundエラーについて。
[clangdで別ディレクトリのヘッダーを指定したい]
[uchan note]
⇑のページでcompile_flags.txtを設定すれば良いことが判る。
ちなみに、ディレクトリ構成は次のように設定していた。
$ tree ./
./
├── CMakeLists.txt
├── LICENSE
├── README.md
├── build
├── common
├── compile_flags.txt
├── getopts ⇐ ここがサブモジュール
│ ├── LICENSE
│ ├── README.md
│ ├── common
│ │ ├── CMakeLists.txt
│ │ └── getopts.cpp
│ └── include
│ └── getopts.hpp
├── include
├── layd.cpp
└── options
Not Foundの該当ファイルはというと、./getopts/include/getopts.hppで、ヘッダファイルのインクルード文はディレクトリなしの#include "getopts.hpp"を指定していました。
で、なんでNot Foundになってたかというと、cppファイルとhppファイルは別ディレクトリにしていたから。それとあとひとつ。compile_flags.txtに
以下のように書いてみたんだけど、これでは解決できず。
-I.
-I./include
-I./../include
怪しいのは3行目というところまではすぐわかった。が、どう直せばよいか解らず。暫くネット検索で解決策を探していたけどやはり解らず。で、3行目を書き換えながら気がついたのが、getoptsディレクトリはGitHubのサブモジュールで、その場合-Iオプションに設定するパスは相対パスだと、うまく認識してくれないということ。そこではっ?!と気がついた。じゃあ、絶対パスだったらうまくいくんじゃね?と。
で、3行目を下のように書き換えてみた。
-I./getopts/include
エラー消えたあたたたたた!ヽ(=´▽`=)ノ
ということで、GitHubのサブモジュールを使っている場合、compile_flags.txtに-Iオプションを絶対パスで指定すればヘッダのインクルードがNot Foundになるのが解決できます。
ちなみに、Gitのサブモジュールではなくて、単なるサブディレクトリの場合、3行目の最初の書き方でもNot Foundエラーは出ません。
最初に、簡単にまとめるとか書いときながら、なんだかんだで微妙に長い解説になってしもた。
というわけで、未来の自分が忘れた時に、解決の一端に慣ればよきかな。
また、同じような内容で困っている方の一助になれば嬉しいです。
最後までお読み頂き、ありがとうございます!