如何复制现有Arduino库并修改以避免重复符号编译报错
问题根因
Arduino 构建系统(包括IDE和VS Code Arduino插件共用的后端)的默认逻辑是:扫描sketch中所有#include指令,只要匹配到已安装到公共库目录的库,就会自动将该库的全部源文件加入编译和链接队列,因此哪怕你将修改后的库文件重命名放到本地sketch目录,原有公共库的符号还是会被引入,导致重复定义报错。
可用解决方案
方案1:配置编译规则排除指定公共库(推荐,无需修改代码)
- 如果你用Arduino IDE 2.x:
打开「文件」-「偏好设置」,在额外的编译参数输入框中加入以下内容:
即可在本次构建中跳过所有公共库中--build-property build.libraries.exclude_patterns=*/foo/*foo库的文件。 - 如果你用VS Code Arduino插件:
打开项目目录下.vscode/arduino.json文件,添加buildPreferences配置项:
保存后重新编译即可。{ // 其他原有配置保留 "buildPreferences": [ ["build.libraries.exclude_patterns", "*/foo/*"] ] }
方案2:为本地修改版库添加命名空间(无需改配置,永久避免符号冲突)
无需修改类名,只需要给你本地的my_foo.h和my_foo.cpp内容套上自定义命名空间即可:
- 在
my_foo.h中,所有类、函数定义外层加命名空间包裹:#ifndef MY_FOO_H #define MY_FOO_H // 新增命名空间 namespace my_foo { // 原有foo.h的类、函数定义全部放在这里 } #endif - 在
my_foo.cpp中,所有实现都指定所属命名空间:#include "my_foo.h" namespace my_foo { // 原有foo.cpp的所有实现代码全部放在这里 } - 使用修改后的库时,加上命名空间前缀即可:
my_foo::FooClass 实例名;
方案3:临时移除公共库(适合临时测试场景)
直接将公共库目录下的foo文件夹剪切到其他位置,编译测试完成后再移回即可,无需修改任何代码和配置。
内容的提问来源于stack exchange,提问作者Llaves
相关产品推荐
相关产品推荐

