我使用emacs一段时间了,想用lsp+ccls的方式管理工程,工程使用CMake, 有compile_commands.json
lsp的配置如下:
(require 'ccls)
(require 'lsp-mode)
(add-hook 'c++-mode-hook #'lsp)
(add-hook 'c-mode-hook #'lsp)
(add-hook 'objc-mode-hook #'lsp)
(add-hook 'python-mode-hook #'lsp)
;;;
;;(use-package lsp-mode
;; :commands lsp
;; :init
;; (setq lsp-auto-guess-root t)
;; :config
;; (require 'lsp-clients)
;; )
;;;
(setq ccls-executable "~/ccls/Release/ccls")
(setq ccls-args '("--log-file=/tmp/ccls.log"))
(setq lsp-prefer-flymake nil)
(setq-default flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck c/c++-gcc))
(require 'company-lsp)
(push 'company-lsp company-backends)
;;(require 'lsp-ui)
;;(add-hook 'lsp-mode-hook 'lsp-ui-mode)
;;(use-package lsp-mode
;; :commands lsp
;; :hook ((c-mode c++-mode objc-mode) . lsp))
工程根目录中还有 .ccls
%clang%lsp --std=gnu++14 -isystem/ust/include
%h -x c+±header
这个配置看网络的,不知道这个文件编写有什么规则
现在的情况是
我的工程中所有的头文件都是问题:ccls:unknown type name ‘xxxx’
有哪位大神指导一下,我该怎么完整正确的配置 lsp ccls
还有 compile_commands.json文件怎样才能让ccls用上?
现在我非常没有头绪
在运行cmake的命令行里加一个参数
-DCMAKE_EXPORT_COMPILE_COMMANDS=1
运行cmake以后会在运行cmake的目录下产生一个compile_commands.json,把这个文件链接到你的项目根目录下即可,ccls会自动找到这个文件并使用的。
还要创建使用ccls --index生成.ccls-cache的文件夹
其实这些我都做过了,现在我发现可能是 .h 的头文件没有被识别为C++的头文件,才导致了一大堆的错误。但是我已经在 .ccls 加入了 %h -x %h c+±header
ccls.log文件有这一条:
22:42:40 ccls project.cc:284 I use /home/sky/Example/.ccls: %compile_commands.json %h -x %h c++-header %c -std=c11 %cpp -std=c++14 -Iinc -DMACRO
我是不是有必要把整个的ccls.log文件上传
怎样做才是正确的让ccls 把.h识别为c++的头文件?
在一个头文件中ccls有如下错误:
ccls: expected ‘;’ after top level declartor[4]
ccls:unkonwn type name ‘class’ [2]
yicao
8
跟这没关系吧,只需要把json文件放到指定目录就行了,ccls有文档说明啊,默认是项目根目录,有了json文件,.ccls就没有存在的必要了
可是我这里一直提示 ccls: use of undeclared identifer ‘std’
ztlevi
10
看ccls的wiki,一般用symbolic link
yicao
11
compilationDatabaseDirectory,把这个配置上就行了
jzt
12
我遇到的更奇葩,一直以为功能都正常,直到有一天打开std=c++17,然后include ,这个std::any就死活识别不了
然而M-.是能打开any头文件的
我也遇到这个问题,很诡异 我在.ccls里已经设置好,但是仍无法正确切换到C++17的标准
clang
%c -std=c11
%cpp -std=c++17
%h -x
%h c++-header
我的.ccls和你的一样
但是我发现因为我的头文件里有C++ 的类和C的结构体类型的时候,所有的类型都会报错,
并且都是ccls:unknow type name ‘xxxxx’, 但是当我把 __cplusplus的判断写在文件前面,就没有错误了
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
但是每个文件都加这一段,显然不是个好方法,根本问题还是没有很好兼容C/C++代码导致的问题,是不是在配置上可以解决,还是在CMake的代码里有解决的办法