lsp-mode下, .h 文件里的函数定义提示变量未定义

我用lspmode编辑 rfm.c 文件, 现在我想把一部分函数定义拆分到一个新文件VT.h 里面, 然后在rfm.c 里面include VT.h. 我不想创建VT.c 文件, VT.h里面实际包含了函数的定义实现. 我也相应地改了Makefile, 现在编译能通过, 并且在 VT.h 里面lsp-find-reference 也能找到rfm.c 里面的文件,问题是为啥 VT.h 里面引用 rfm.c 里面变量都提示未定义? 这个有办法解决吗?

代码在这个commit 里: https://gitee.com/guyuming76/rfm/commit/d19e1efbfbdb7f4a02c2c7c60dd3d0eb5a32cb88

我正 VT.h 里面加 extern 变量声明,并且在 rfm.c 里面去掉static 变量修饰, 重新编译, emacs就不提示未定义了, 但不这么改编译也能通过啊,并且可以省去在VT.h里面的声明代码.

瞎诌一下吧:clangd和编译器(+链接器)做的工作是不一样的,从编译的角度来说,clangd最多做到语义分析,但是你在编译的时候链接器也参与,它会做一些名字解析和绑定等的工作。

回到你的问题,你在VT.h里直接用rfm.c中的变量或者函数而又没有通过external告诉clangd这些东西是在其它文件里的,clangd应该就不费劲去折腾了,直接告诉你找不到。

另外两个小问题:1. 函数实现一般还是放在.c文件里,另外.c包含头文件,头文件又引用c文件内的变量,有点混乱;2. 给的gitee链接打开还需要登录,导致没法看你的代码,是私有仓库吗?

谢谢, 我对编译器这块不熟,虽然也很神往.

我编译的时候用 bear – make 命令, bear 录取 编译器的命令,生成 compile_commands.json, 然后clangd读取这个文件.

bear要是把链接命令也录下来, 然后配合clangd或别的啥工具是不是就能提示了呢? 有没有这样的工具? 我那个库gitee里设成开源(所有人可见), 如果要登录而不是匿名目前我也觉得未尝不可,gitee的登录选项貌似还是非常丰富的. 登录有啥不方便吗? 排除登录操作麻烦,我的理解是否匿名区别只是搜索引擎可见性.

最初的代码源于 GitHub - padgettr/rfm: Simple file manager for dwm, 我已经改了很多了, license 啥的我不是很确定,反正主要基于的应该是gtk

本来这个项目的代码,除了config.h里少量配置性的全局变量,都在rfm.c一个文件里, lsp + clangd 工作得挺稳定.

最近我为了增加代码可读,另外拆分出几个文件,lsp有时候不知为啥就不稳定了. 遇到这种情况, 我目前就用 helm-gtags 模式补充.