ターゲット:AとBという2つのcファイルがあり、BをオブジェクトファイルにコンパイルせずにAに直接含める場合は、clangd(またはKateで使用される他のLSPサービス)はDo Iだけを通知できます。 Aを直接コンパイルすると、Bにエラーが発生しますか?つまり、AはBのコンパイルエラーの「入力ファイル」です。
標準包含慣行に対する拒否について話してください。
最も簡単な例:これがmain.cであるとします。
#include <stdio.h>
#include "test.c"
int main() {
test();
return 0;
}
test.cは次のようになります
void test() {
printf("Hello world!\n");
}
test.c をオブジェクトファイルにコンパイルすると、次のエラーが発生します。
> clang -c test.c -o test
test.c:2:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)' [-Wimplicit-function-declaration]
printf("Hello world!\n");
^
test.c:2:5: note: include the header <stdio.h> or explicitly provide a declaration for 'printf'
もちろん、KateのLSPサーバーはそれに気づき、test.cで「printf」を強調表示して修正します。
それでは、test.cを別々にコンパイルする予定がないとしましょう。私は実行したいだけです:
clang main.c
stdioがmain.cに含まれると、test.cも含まれるため、コンパイル時にエラーは発生しません。したがって、LSPサーバーが私に示したprintf警告(test.cのコンパイル機能のスタンドアロンデモとしては役に立ちますが)は、私がどのようにプログラムをコンパイルしたかに影響を与えませんでした。
この場合、LSPサーバーにmain.cのみをコンパイルするように指示し(main.cをコンパイルの「エントリポイント」と見なす)、kateにmainコンパイルによって発生したtest.cのエラーのみを強調表示させることができます。氏?特定の例では、test.c でエラーは強調表示されません。
また、「エントリポイント」の定義は通常、いくつかのコンパイル選択ではなくランタイムエントリポイントを表すので無視することができますが、私が要求する名前がある場合はそれが何であるかよくわかりません。
答え1
私が考えることができる唯一の方法は、compile_commands.json
データベースを手動で変更し、データベースから2番目のファイルを除外することです。
または、clangd
構成を通じてこれを行うこともできます。ここ。