导入 Keil 项目后编译失败
可能原因:原 MDK 项目中使用了 RTE
组件(多数原因),项目中的某些文件/文件夹被单独设置了特殊的编译参数:
原 MDK 项目中使用了 RTE
组件:
由于 MDK 的 RTE
组件在 uvprojx
项目文件里的描述比较复杂,eide 暂时不支持导入这些 RTE
组件
因此如果你的项目带有 RTE
组件,建议不要导入 (仅带有 CMSIS 组件的除外) 使用,带有 RTE
组件的带有如下绿色标志:
项目中的某些文件/文件夹被单独设置了特殊的编译参数:
eide 也支持这种功能,只是跟 mdk 上稍有区别,见 为源文件附加单独的编译选项
因此你需要自行将 mdk 上的这些单独指定的编译参数,按照上述文档的方法添加至 eide 的配置中,才能正常完成编译
总的来说,mdk 属于商业软件,很多文档、信息不公开,eide 对于 mdk 项目信息的导入是有限的;这种项目导入,只是为了尽量减少跨软件迁移项目时的工作量,如果 你本来就不了解你的项目 或者 项目过于庞大,建议你不要轻易使用导入功能,因为它本身就是不完备的
编译/链接失败
构建工具输出的 编译、链接 错误信息都来自编译器的原始输出,将编译错误信息复制后放入浏览器搜索,基本可以在网络上找到相同的问题和解决方法,本处只对常见的错误信息作一个解释:
链接时出现 Undefined symbol xxxx
:
原因:项目缺失了某些源文件,导致其中的函数/全局变量没有被编译,而一些其他源文件中又引用了这些函数/全局变量,因此链接器需要链接这些符号,但无法找到这些符号的位置,所以抛出此错误;
建议:根据符号名称搜索其定义位置,将所在的源文件添加至项目
编译时出现 can not open xxx file xxx
:
原因:源文件路径存在中文,无法识别的字符,路径不存在,路径为不存在的文件链接 等;由于很多编译器只认识 ASCII 码,虽然 GBK 也是 ASCII 码组成,但由于系统代码页、终端代码页、vscode 字符集的不同,插件在传递编译参数时可能会出现乱码,虽然构建工具使用相对路径传递文件路径能够避免一些中文字符的存在,但如果你在源文件名,输出目录名 中仍然使用中文,同样会导致编译出现该问题;
建议:在项目路径、文件名中完全使用英文
乱码问题
语法提示异常
常见问题:语法提示错误但程序编译没问题、跳转定义不正常、无法提供补全、莫名其妙的错误波浪线
首先 vscode 上是插件相互协作,eide 只提供编译功能,C/C++ 插件提供 定义跳转/代码高亮/代码补全/悬停提示
等浏览功能;
C/C++ 插件只是个代码浏览的辅助工具,它原本是用来支持 PC 平台的 C/C++ 程序,虽然对于大多数单片机程序,它也能很好的工作,但由于单片机种类过多,编译器也多种多样,支持的语法也不尽相同,因此对于一些特殊语法,特殊的编译器,C/C++ 插件肯定会无法很好的解析理解你的代码,进而给出错误的语法提示;因此不要盲目的去相信 C/C++ 的语法提示,建议在插件设置中关闭 C/C++
的错误提示:C_Cpp.errorSquiggles
;
编译器给出的错误信息才是值得你去关注的;
如何关闭 C/C++ 插件的错误提示?:
仅为 当前工作区
关闭错误提示:
打开工作区下的 *.code-workspace
文件,在 settings
字段中添加如下设置:
"C_Cpp.errorSquiggles": "Disabled",
为 当前用户
关闭错误提示:
打开 VsCode 设置,搜索:C_Cpp.errorSquiggles
,将其值设置为:Disabled