C++の補完環境をclangd+LSPで導入しようとしたらめちゃくちゃ苦労した話

LSP環境構築にあまり慣れていないくせに使ったことのない言語で

■調べてつまずいたポイント
Windowsでclangdの導入方法がどこにも書いてない(clangの導入方法ばっか出てくる)
LSPから通知されるiostream file not found いやいやいや、g++は通るから!
compile_flags.txtの配置場所
ランゲージサーバー側のエラーログの確認方法
そもそもWindowsでやってる人すくない

■最終的に
補完が思ったように動作するようになりました。
環境設定の問題か、PCスペックの問題か、OSの問題かわからないけれど、
ネットで見るほどエラーチェック早くないけど、とりえず動けばよい!(わかる人に教わりたい)

■手順(本題)
私の最終的に設定した方法と参考にしたサイトを紹介していきます。

前提として、コンパイラはMinGWを利用します。
※WSLでg++流すとかイケイケなことしたかったけど、様々な課題があり、断念。

【1】まずランゲージサーバーの導入を行います。
・LLVM Clang の Windows へのインストールと使い方
http://yohshiy.blog.fc2.com/blog-entry-294.html
・MinGW(gcc) の Windows へのインストールと使い方
http://yohshiy.blog.fc2.com/blog-entry-292.html

【補足とか】
LLVMをインストールすれば、clangdはインストールされます。clangも。
MinGWはインストールパスを変えないようにしましょう的なこと書いてあるけど、そもそもclangdはmingwみてくれてないので関係なかったです。
パスは通す設定にしましょう。
僕は以下みたいなパスが通ってる状態です。
C:\MinGW\bin
あと32bit版mingw入れていたらto_string使えない問題が勃発して結局64bit版に乗り換えた。

【2】VIM側のLSPの導入をします。
ここは別記事でいずれ紹介するため、割愛。
主に以下のサイトを参考にしました。

・vim8,neovimで補完使うならdeopleteよりvim-lsp使おうぜ

さて、ここまでやってうまく動かないはずです。
※少なくとも僕は動きませんでした。
慌てずに解決策を以下に記載します。

【3】うまく認識されない問題の洗い出し(解決策を知りたい方は4まで飛ばしてよいです。)
試しにhelloworldプログラムを書こうとすると、includeにエラーが・・・
原因を探す手順をいくつか紹介します。

1. VIMで表示されたエラーの内容を確認する
vimrcに以下のグローバル変数を追加
let g:lsp_diagnostics_echo_cursor = 1
これを行うことで、vim内でエラー行にカーソルを合わせたときになぜエラーとなったか表示されます

2. iostream file not found
g++を利用したQuickRunは通るのになぜかファイルがねーよといわれる。
これは利用するコンパイラからファイルが見えていないため。
以下のブログを参考にしたけど、いまいちわからず、

・ClangdでC++ソースコードを補完する際にコンパイルオプションを指定する方法

執筆者の方に連絡して、アドバイス頂きました。(本当に助かりました。)
今回のファイルがみつからない問題と違うと判断(結果的にはこのブログ記載の手順を使うことになります。)

3. ではコマンドプロンプトから直接やったらどうか?
コマンドプロンプトで以下をたたく
g++ [ファイル名] → 通る
clang++ [ファイル名] →  iostream file not foundがでる。これだ!
※そもそもコマンドたたけないならパスが通ってないか、インストールしてないです。
※clang++ でのコンパイルが通ればclangdのエラーチェックにも引っかからなくなる。

clang++ -v [ファイル名] で再度実行すると、includeファイルをどこに探しにいっているかみれる。
私の場合、visualstudioのフォルダを探しにいっていて、そもそもVSはいれていないため、見つからなかったようだ。

4. clang++ でコンパイルを通すには・・・・?
同じ問題で悩んでいる方が。

・clangのエラーに困っています。
https://teratail.com/questions/164495
→ ここでの記載があるように、コンパイルオプションをつけると成功する

clang++ –target=i686–target=i686-pc-windows-gnu [ファイル名] →成功!!!
コンパイルオプションをつけることで、通った。

【4】結果成功した手順
compile_flags.txt に以下を記載

–target=i686–target=i686-pc-windows-gnu
※ちなみにwingw64bit版だとオプションの設定が違います。自分の環境でg++ -v してでてきたTargetの項目を–target=の後ろに書いてあげてください。

compile_flags.txt をソースファイルと同階層に配置

することで、解決しました。(includeでエラー表示がなくなった!)
もっと軽快に動いてくれればなーとは思いますけど、動かすまでに2日くらいかかってるので、しばらくはこれでいいかな。

lspの設定何できるかしらべよー。

コメントを残す

メールアドレスが公開されることはありません。