我有一些关于Linux内核驱动程序的代码。我使用bear 来生成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"
这是我的Makefiles:
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显示当包含时存在一些问题,问题如下:
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。在这个函数clangd(-Wvisibility)之外,未知类型名 .the inode也有警告声明'struct‘不可见,
如何修复并找到ssize_t?
欢迎所有帮助,谢谢:)
发布于 2022-03-20 00:43:04
你用什么编译器来构建代码?我也遇到了同样的问题,有Clang的建筑似乎解决了这个问题。GCC和Clang有一些只由两个编译器中的一个实现的选项,或者命名不同的选项,因此clangd
不理解GCC使用的所有参数。
例如,
make CC=clang defconfig
make CC=clang
或交叉汇编:
make CC=clang ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
make CC=clang ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
然后可以运行scripts/clang-tools/gen_compile_commands.py
来生成compile_commands.json
。在重新启动VSCode或clangd
并在项目中打开一个C文件之后,您应该会再次看到索引的开始,而这一次输出中不应该出现任何错误,交叉引用应该在它完成后才能工作。
发布于 2022-10-21 16:45:32
与Clang合作建设肯定是一个解决方案,但有时与GCC一起建设是必要的。在这种情况下,选项是有帮助的。
这是.clangd的一个示例配置,它告诉clangd忽略这些选项,然后警告消失。
CompileFlags:
Remove: [-fconserve-stack, -fno-allow-store-data-races, -mfunction-return=thunk-extern, -mindirect-branch-cs-prefix, -mindirect-branch-register, -mindirect-branch=thunk-extern, -mskip-rax-setup, -mpreferred-stack-boundary=3, -mno-fp-ret-in-387]
https://stackoverflow.com/questions/70819007
复制相似问题