【发布时间】:2020-05-28 12:53:54
【问题描述】:
我正在和一个朋友一起做一个 Arduino 项目,我们需要 2 个外部库,OneWire 和 DallasTemperature。我可以轻松地将它们安装在我的计算机上,它会完全正常工作,但我实际上想将它们安装在我的 git 文件夹中,这样任何人都可以立即使用我的代码。我的文件夹结构如下:
project_folder/
> libraries/
> OneWire/
> OneWire.h and OneWire.cpp and so
> DallasTemperature/
> DallasTemperature.h and DallasTemperature.cpp and so
> project.ino
在头文件中,我不得不更改一些引用,主要是文件路径,所以#include <OneWire.h> 变成了#include "../OneWire/OneWire.h" 等等,我没有发现任何错误。在我的 project.ino 中,我使用 #include "libraries/OneWire/OneWire.h" 和 #include "libraries/DallasTemperature/DallasTemperature.h" 加载了这两个库,它们似乎都可以正常工作,但是当我验证我的代码时,我收到以下错误:
C:\Users\<my username>\AppData\Local\Temp\ccZFsuFb.ltrans0.ltrans.o: In function `global constructors keyed to 65535_0_project.ino.cpp.o.1999':
<artificial>:(.text.startup+0x5e): undefined reference to `OneWire::begin(unsigned char)'
<artificial>:(.text.startup+0x6a): undefined reference to `DallasTemperature::DallasTemperature(OneWire*)'
C:\Users\<my username>\AppData\Local\Temp\ccZFsuFb.ltrans0.ltrans.o: In function `setup':
C:\Users\<my username>\Documents\<project folder>/project.ino:13: undefined reference to `DallasTemperature::begin()'
C:\Users\<my username>\AppData\Local\Temp\ccZFsuFb.ltrans0.ltrans.o: In function `loop':
C:\Users\<my username>\Documents\<project folder>/project.ino:17: undefined reference to `DallasTemperature::requestTemperatures()'
C:\Users\<my username>\Documents\<project folder>/project.ino:19: undefined reference to `DallasTemperature::getTempCByIndex(unsigned char)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino Uno.
是否有可能将这些库安装在我的项目文件夹中,还是我真的必须在每个系统上单独安装它们?
【问题讨论】:
-
您可以将目标文件添加到您的 git 存储库,但我认为这通常被认为是不好的做法,还有其他工具可以创建和管理第三方库的依赖项。但是,考虑到这是一个与朋友合作的 Arduino 项目,而不是商业生产代码库,请添加。
-
对目标文件使用
git确实不是一个好主意。每次编译时都需要推送它们,它们的所有版本都将在那里。在 10000 次编译后克隆该 repo 将是一个真正的痛苦。对目标文件使用一些云服务,对源代码使用 git。 -
.cpp 文件通常会在您在同一文件夹中包含具有相同名称的标头时自动编译和链接。没有清楚在这种情况下出了什么问题。 “等等”在您的文件夹层次结构中是什么意思?
OneWire::begin(unsigned char)是否在 OneWire.cpp 中定义(例如),或者是否有其他文件尚未编译/链接?打开“显示详细输出”并将完整日志添加到您的问题中,以便我们可以看到构建系统实际在做什么。 -
我能找到的所有示例(例如 stackoverflow.com/questions/4705790/…)都使用子文件夹
"src"而不是"libraries",但我认为这没有必要——只是一个约定,或者可能是 Cargo Cult 编程.