在vscode裏閱讀 pjsip 的源碼時, 由於以前安裝的智能提示插件是微軟的c/cpp, 所以默認就直接能跳轉、智能提示了。 可是它有個問題啊: 默認會自動解析所有代碼、生成一個數據庫(體積有點巨大啊)
後來聽說clangd更牛逼, 就學習一下。 安裝了clangd之後,它提示和微軟的c/cpp插件衝突, 需要禁用一個。 留下clangd咯, 寫代碼挺流暢, 智能提示、語法渲染等都正常,速度也極快。
但是在閱讀pjsip工程的源碼時,竟然很多類型、函數無法識別。 想想是缺少 compile_commands.json, 那就在 vc 裏生成一個給它吧(vc的插件 Clang Power Tool 可以導出 compile_commands.json), 注意生成的文件要放在工程的根目錄。
重新打開 vscode, 加載工程。 大部分文件都能正常識別了: 宏解析、變量原型、函數等等都可以跳轉。 但是竟然還有少部分頭文件依然無法識別,仔細檢查了 vscode 的output窗口,看到解析這個 c 文件的時候竟然只傳遞了一個 include 路徑,,可是在 compile_commands.json中明明有寫3個的,,這發生了啥?暫時搞不懂(後面分析出原因了)。 google了一番,在stackoverflow 和 clangd的官網學到了一種解決方法: 在vscode -》 “open project configuration file” -> 打開了一個 .clangd 的yml文件(首次打開會在項目根目錄創建), 填入一下內容(注意是yml), 保存,重啓vscode,重新打開 c 文件就正常了。
CompileFlags:
Add:
- "-IE:/pjproject-2.8/pjsip/include"
- "-IE:/pjproject-2.8/pjlib/include"
- "-IE:/pjproject-2.8/pjlib-util/include"
備註: 參考網址https://clangd.llvm.org/config#compileflags 參考的
後面排查出clangd不能根據compile_commands.json裏的編譯參數來parse 全部頭文件包含路徑了: 因爲vc 裏導出每個工程的compile_commands.json 都是完整的json數組, 而我直接把它們都合併成一個大文件的時候,並沒有去掉多餘的 [ ], 導致一個文件裏出現了多個根節點。 手工把多餘的 [ ] 刪掉, 只保留一個巨大的數組即可。 重新打開vscode就能自動分析所有c文件,且跳轉、提示都正常了。呵呵呵~~~