如何在arduino ide中修复"undefined reference to:",尝试使用googletest

How to fix "undefined reference to:" in arduino ide, trying to use googletest

本文关键字:to googletest reference undefined arduino ide      更新时间:2023-10-16

我正在尝试使用googletest库来测试arduino ide中的代码,但不断收到诸如

在函数中__static_initialization_and_destruction_0未定义 引用 'std::ios_base::Init::Init()'

此错误还有 50 行,包括

对测试的未定义引用::测试::SetUp()' 未定义的引用 测试::测试::拆解()

由于即使是基本的测试功能也失败了,我认为我在放置库文件的位置上犯了一个错误,或者我只是没有包含正确的文件。

目前我只包括gtest/gtest.h,因为这是我在其他示例中看到的全部内容,以便代码正常工作。

我已经使用cmake和make构建了googletest库,并将其包含在项目中。

有没有人知道我能做些什么来解决这个问题?

您无法在 Arduino IDE 中编译 googletest。主要是因为Arduino IDE使用的编译器旨在生成(对于普通arduinos)AVR二进制文件,而不是x86/x86-64二进制文件。这些AVR二进制文件不能在普通PC上运行,只能在嵌入式平台上运行。由于在嵌入式平台上,正常的标准文本IO流不可用,因此arduino IDE不包括普通PC上用于终端使用的标准IO。(又名 Unix 上的管道 0 1 2)。

我已经使用cmake和make构建了googletest库,并将其包含在项目中。

这是行不通的。如果你用cmake/make编译googletest,你可能正在构建一个x86x86-64二进制文件,然后你把它包含在arduino IDE中。然后,arduino IDE编译器将尝试将AVR二进制文件链接到x86/x86-64库。这是行不通的。

我建议您以这样一种方式设计您的软件,如果您确实想使用 googletest 测试您的 Arduino 代码,那么从您的业务逻辑中删除硬件相关逻辑。然后,可以通过编译("正常")x86x86-64二进制文件来对业务逻辑进行单元测试,测试代码可以在普通PC上运行。这将涉及模拟代码中使用的硬件接口。这个构建基础设施可以很容易地在你的arduino项目的相同结构中设置,测试只涉及构建一个测试二进制文件并运行它。

Google 测试已在各种平台上使用:

  • Linux目录
  • Mac OS X
  • 窗户
  • 天鹅座
  • 明广
  • 视窗移动版
  • 塞班
  • 平台IO

没有Arduino,没有微控制器