Emacs使用LSP-ccls报重载函数引用无法解析错误但代码可运行原因咨询
问题原因
你的代码本身语法合法,可正常编译运行,ccls抛出该错误属于语法诊断参数和实际编译环境不匹配导致的误报,核心诱因有两个:
- ccls未获取到正确的C++语言标准配置,默认启用的标准版本过低,无法正确推导
std::endl这个模板函数的重载匹配关系。 - 你当前没有为项目生成
compile_commands.json编译数据库,ccls只能使用内置的默认参数做语法检查,和你实际编译代码时用的编译器参数不一致。
解决方法
方案1:全局配置默认C++参数(适合临时测试单文件的场景)
修改你的Emacs ccls配置,添加默认编译参数,强制指定C++标准:
(use-package ccls :ensure t :config (setq ccls-executable "ccls") (setq lsp-prefer-flymake nil) (setq-default flycheck-disabled-checkers '(c/c++-clang c/c++-cppcheck c/c++-gcc)) ;; 新增下面这行,指定默认用C++17标准解析C++代码 (setq ccls-args '("--init={\"clang\": {\"extraArgs\": [\"-std=c++17\", \"-xc++\"]}}")) :hook ((c-mode c++-mode objc-mode) . (lambda () (require 'ccls) (lsp-deferred))))
修改后重启Emacs或者重载ccls配置即可生效。
方案2:项目级配置(适合正规项目开发场景)
两种方式二选一即可:
- 如果你用CMake管理项目,编译时添加
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON参数,生成compile_commands.json文件放到项目根目录,ccls会自动读取文件内的编译参数,和实际编译环境完全对齐,不会再出现误报。 - 不用CMake的话,可以在项目根目录新建名为
.ccls的文件,写入以下内容:
重启ccls后就会按该配置解析项目代码。%cpp -std=c++17
内容的提问来源于stack exchange,提问作者yaoya
相关产品推荐
相关产品推荐

