Linux カーネル ドライバーに関するコードがいくつかあります。bear makeを使用して compile_commands.json を生成します。
これは私の compile_commands.json の一部です:
"directory": "/usr/src/linux-headers-5.4.0-90-generic",
"file": "../../../home/ubuntu/programs/linuxKLearn/2/2.1/PrintingDriver/DriverFileOperations.c"
これは私のメイクファイルです:
ifneq ($(KERNELRELEASE),)
obj-m := PrintModule.o
PrintModule-objs := DriverMain.o DriverFileOperations.o
EXTRA_CFLAGS := -DTEST_DEBUG -ggdb -O0
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
rm *.order *.symvers *.mod.c *.o .*.o.cmd .*.cmd .tmp_versions -rf
endif
しかし、Vscode と clangd を使用してそれらを読み取ると、clangd は、<linux/mm.h> をインクルードするときにいくつかの問題があることを示します。問題は次のとおりです。
Unknown argument: '-mno-fp-ret-in-387'
Unknown argument: '-mpreferred-stack-boundary=3'
Unknown argument: '-mskip-rax-setup'
Unknown argument: '-mindirect-branch=thunk-extern'
Unknown argument: '-mindirect-branch-register'
......
そして、clangd は ssize_t を見つけることができません。不明な型名 'ssize_t'clang(unknown_typename) .inode にも警告がありますDeclaration of 'struct inode' will not be visible outside of this functionclang(-Wvisibility) ,
インクルード <linux/mm.h> を修正して ssize_t を見つけるには?
すべての助けを歓迎します、ありがとう:)