【发布时间】:2020-10-13 04:46:03
【问题描述】:
Embedded Template Library提供了STL的数据结构,不使用动态分配,用于嵌入式开发。
我正在 Atmel Studio 中试验 ATSAMD21,但无法使用动态分配。因此我尝试了 ETL,但它给了我在尝试使用 STL 时遇到的相同错误:
Error ld returned 1 exit status
Error undefined reference to `_exit'
Error undefined reference to `_close'
Error undefined reference to `_fstat'
Error undefined reference to `_isatty'
Error undefined reference to `_lseek'
Error undefined reference to `_read'
Error undefined reference to `_sbrk'
Error undefined reference to `_kill'
Error undefined reference to `_getpid'
Error undefined reference to `_write'
据我所知,这些错误意味着为编译器选择了错误的目标架构。但是,情况并非如此,因为在我定义单个 ETL 结构之前,我的程序运行良好。此外,ETL 仅由一堆头文件组成。
我的猜测是 ETL 使用来自 STL 的代码,而 Atmel Studio 中包含的 gnu 编译器无法处理它。 (但如果 STL 完全不可用,他们为什么还要包含它?)
不过,ETL 据说可以使用even without STL。
所以我在我的项目中定义了#define ETL_NO_STL,但我仍然遇到同样的错误。
新
在“发布”模式下似乎可以正常工作,这些错误只出现在“调试”中。
debug 和 release 之间的差异并不表明我在其中一个中使用了 STL,而在另一个中:
调试:
"C:\Program 文件 (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-g++.exe" -mthumb -D__SAMD21J18A__ -DDEBUG -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD21_DFP\1.2.276\samd21a\include" -I“C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\4.2.0\CMSIS\Include”-O1 -ffunction-sections -fno-rtti -fno-exceptions -mlong-calls -g3 -Wall -mcpu=cortex-m0plus -c -MD -MP -MF "main.d" -MT"main.d" -MT"main .o" -o "main.o" ".././main.cpp"
发布:
"C:\Program 文件 (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-g++.exe" -mthumb -D__SAMD21J18A__ -DNDEBUG -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD21_DFP\1.2.276\samd21a\include" -I“C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\4.2.0\CMSIS\Include”-O1 -ffunction-sections -fno-rtti -fno-exceptions -mlong-calls -Wall -mcpu=cortex-m0plus -c -MD -MP -MF "main.d" -MT"main.d" -MT"main.o " -o "main.o" ".././main.cpp"
唯一的另一个区别是调试版本有一个额外的行: 使用程序集“C:\Program Files (x86)\Atmel\Studio\7.0\Extensions\Application\AvrGCC.dll”中的“RunCompilerTask”任务。
调试级别不是原因。将其设置为 g3、g2、g1 或将其关闭不会改变任何内容。区别在于命令中是否有 NDEBUG。也许没有它,会执行一些不必要的 POSIX 一致性检查?
【问题讨论】:
-
所有这些缺失的函数都是 POSIX 系统调用。在不了解 ETL 的情况下,您是否正确配置了它?也许它不能在没有实现某些基本 POSIX 功能的系统上使用?文件怎么说?您的配置看起来如何(阅读创建
etl_profile.h文件所需的文档,请包含它)? -
@Someprogrammerdude :是的,我确实创建了配置文件头,并在其中添加了 ETL_TARGET_DEVICE_ARM。
-
您的 Cortex M0 似乎没有 Linux。它似乎是一个微控制器,而不是 PC。从而避免以下事情:动态分配、C++、POSIX、STL、PC 编程。
-
另外,我强烈建议不要在 C++ 以下编译 Atmel bloatware ASF,因为这会破坏整个事情。它一开始就很糟糕,即使编译为 C。是否可以在没有 bloatware 库的情况下使用 Atmel Studio?
-
@Lundin 我没有使用 ASF,也没有使用动态分配。而且我没有使用 POSIX,至少在不知情的情况下。我已经为这个平台编写了 C++ 应用程序,它们运行良好。现在我需要一些树,手动实现会很麻烦。我之所以选择 ETL,是因为它不使用动态分配,而且 ETL 的多映射似乎非常适合这项工作。我使用了 arduino 配置文件,它应该支持最简单的微控制器,但仍然出现上述错误。
标签: c++ stl arm embedded atmelstudio