0

我正在使用 arm-none-eabi-gcc/g++ 工具链为 ARM Cortex_M7 编译裸机 C++,它工作正常,在我的板上闪烁漂亮的固件。

现在,当/如果我想包含“好旧的”C++<mutex>, <queue>, <iostream>...文件时,我会遇到编译错误的瀑布(我不会费心粘贴到这里,因为我知道这些不相关..)

这是预期的吗,因为这些根本不可用,我应该作为一个男人,像我现在所做的那样自己编写自己的队列、互斥体、...类(听起来有点像重新发明轮子)还是我缺少“系统根”?但是……世界上每一个 ARM-Cortex_Mx 架构都有这样的东西吗?

我可能对在 sysroot、std、linux 之间阅读内容感到困惑,也许我需要下载一个适当的工具链(arm-none-linux-gnueabi-g++?),其中包含一个特定的“sysroot”(包含我的所有包含和库)目标)因为我Linux 环境中编译,即使我的目标不会在 Linux(裸机)上运行?

恐怕我不能用谷歌搜索合适的主题(或者用谷歌搜索错误?)

感谢您的澄清!

编辑:

  • 包含 and 时出错:

    $~>制作

    CXX obj/src/hot_queue.o

    在 /usr/arm-none-eabi/include/c++/9.2.0/ext/string_conversions.h:43 包含的文件中,

             from /usr/arm-none-eabi/include/c++/9.2.0/bits/basic_string.h:6493,
    
             from /usr/arm-none-eabi/include/c++/9.2.0/string:55,
             from /usr/arm-none-eabi/include/c++/9.2.0/stdexcept:39,
             from /usr/arm-none-eabi/include/c++/9.2.0/array:39,
             from /usr/arm-none-eabi/include/c++/9.2.0/tuple:39,
             from /usr/arm-none-eabi/include/c++/9.2.0/mutex:38,
             from src/hot_queue.hpp:27,
             from src/hot_queue.cpp:29:
    

    /usr/arm-none-eabi/include/c++/9.2.0/cstdio:127:11: 错误:'::printf' 尚未声明

    127 | 使用 ::printf;

    | ^~~~~~

/usr/arm-none-eabi/include/c++/9.2.0/cstdio:134:11: 错误:'::scanf' 尚未声明 134 | 使用 ::scanf;

  |           ^~~~~

make: *** [mak/Makefile.sam.in:359: obj/src/hot_queue.o] 错误 1

实际上,另一个很好的例子是:这次 g++确实找到了正确的文件……但无法编译它……宏错误:

   ~> make
CXX     obj/src/hot_can.o
CXX     obj/src/hot_main.o
In file included from /usr/arm-none-eabi/include/c++/9.2.0/vector:60,
                 from src/hot_can.hpp:28,
                 from src/hot_can.cpp:30:
/usr/arm-none-eabi/include/c++/9.2.0/bits/stl_algobase.h:246:56: error: macro "min" passed 3 arguments, but takes just 2
  246 |     min(const _Tp& __a, const _Tp& __b, _Compare __comp)
      |                                                        ^
In file included from ./sam/boards/samv71_xplained_ultra/samv71_xplained_ultra.h:40,
                 from src/hot_can.cpp:24:
./sam/utils/compiler.h:810: note: macro "min" defined here
  810 | #define min(a, b)   Min(a, b)
      | 
In file included from /usr/arm-none-eabi/include/c++/9.2.0/vector:60,
                 from src/hot_can.hpp:28,
                 from src/hot_can.cpp:30:
/usr/arm-none-eabi/include/c++/9.2.0/bits/stl_algobase.h:268:56: error: macro "max" passed 3 arguments, but takes just 2
  268 |     max(const _Tp& __a, const _Tp& __b, _Compare __comp)
      |                                                        ^
In file included from ./sam/boards/samv71_xplained_ultra/samv71_xplained_ultra.h:40,
                 from src/hot_can.cpp:24:
./sam/utils/compiler.h:821: note: macro "max" defined here
  821 | #define max(a, b)   Max(a, b)
      | 
In file included from /usr/arm-none-eabi/include/c++/9.2.0/vector:60,
                 from src/hot_can.hpp:28,
                 from src/hot_main.cpp:36:
/usr/arm-none-eabi/include/c++/9.2.0/bits/stl_algobase.h:246:56: error: macro "min" passed 3 arguments, but takes just 2
  246 |     min(const _Tp& __a, const _Tp& __b, _Compare __comp)

编辑:

包括在我的代码中:

CXX     obj/src/hot_tmc.o
arm-none-eabi-g++  -mcpu=cortex-m7 -mthumb -D__SAMV71Q21B__  -O1 -DDEBUG -D__SAMV71Q21B__ -Dscanf=iscanf -DARM_MATH_CM7=true -Dprintf=iprintf -DBOARD=SAMV71_XPLAINED_ULTRA -I./src -I./inc -I./lib -I./com/boards -I./com/services/clock -I./com/services/gpio -I./com/services/ioport -I./com/services/sleepmgr -I./com/services/sleepmgr/sam -I./com/services/serial -I./com/services/serial/sam_uart -I./com/utils -I./com/utils/stdio/stdio_serial -I./sam/boards -I./sam/boards/samv71_xplained_ultra -I./sam/drivers -I./sam/drivers/afec -I./sam/drivers/matrix -I./sam/drivers/mcan -I./sam/drivers/mpu -I./sam/drivers/pio -I./sam/drivers/pmc -I./sam/drivers/tc -I./sam/drivers/uart -I./sam/drivers/usart -I./sam/utils -I./sam/utils/cmsis/samv71/source/templates -I./sam/utils/fpu -I./sam/utils/header_files -I./sam/utils/cmsis/samv71/include -I./sam/utils/preprocessor -mfloat-abi=softfp -mfpu=fpv5-sp-d16 -mlong-calls -std=gnu++17  -pipe -Wall  -Wpointer-arith -ffunction-sections -fdata-sections -fno-strict-aliasing -Wmain -Wparentheses -Wchar-subscripts -Wcomment -Wformat=2 -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wwrite-strings -Wmissing-declarations -Wsign-compare -Waggregate-return -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls  -Wlong-long -Wunreachable-code -Wcast-align --param max-inline-insns-single=500  -g3 -MD -MP -MQ obj/src/hot_tmc.o -c src/hot_tmc.cpp -o obj/src/hot_tmc.o
In file included from /usr/arm-none-eabi/include/c++/9.2.0/ext/string_conversions.h:43,
                 from /usr/arm-none-eabi/include/c++/9.2.0/bits/basic_string.h:6493,
                 from /usr/arm-none-eabi/include/c++/9.2.0/string:55,
                 from /usr/arm-none-eabi/include/c++/9.2.0/stdexcept:39,
                 from /usr/arm-none-eabi/include/c++/9.2.0/array:39,
                 from /usr/arm-none-eabi/include/c++/9.2.0/tuple:39,
                 from /usr/arm-none-eabi/include/c++/9.2.0/mutex:38,
                 from src/hot_tmc.cpp:26:
/usr/arm-none-eabi/include/c++/9.2.0/cstdio:127:11: error: '::printf' has not been declared
  127 |   using ::printf;
      |           ^~~~~~
/usr/arm-none-eabi/include/c++/9.2.0/cstdio:134:11: error: '::scanf' has not been declared
  134 |   using ::scanf;
      |           ^~~~~
In file included from src/hot_tmc.cpp:30:
src/hot_log.hpp: In member function 'void LOG::LogThis(LOG::log_ID, const char*, const char*, int, Params&& ...)':
src/hot_log.hpp:132:13: error: there are no arguments to 'printf' that depend on a template parameter, so a declaration of 'printf' must be available [-fpermissive]
  132 |             printf(buffer);
      |             ^~~~~~
src/hot_log.hpp:132:13: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
src/hot_log.hpp:136:7: error: there are no arguments to 'printf' that depend on a template parameter, so a declaration of 'printf' must be available [-fpermissive]
  136 |       printf(" %s\r\n", RESET);
      |       ^~~~~~
src/hot_tmc.cpp: In member function 'void TMC::PrintNewTC(const CANPckt&)':
src/hot_tmc.cpp:94:9: error: 'printf' was not declared in this scope
   94 |         printf("[%d] 0x%2x (%3d)\r\n", i, tcPckt.GetPcktByte(i),  tcPckt.GetPcktByte(i) );
      |         ^~~~~~
src/hot_tmc.cpp:31:1: note: 'printf' is defined in header '<cstdio>'; did you forget to '#include <cstdio>'?
   30 | #include "hot_log.hpp"
  +++ |+#include <cstdio>
   31 | 
In file included from src/hot_tmc.cpp:30:
src/hot_log.hpp: In instantiation of 'void LOG::LogThis(LOG::log_ID, const char*, const char*, int, Params&& ...) [with Params = {const char (&)[28]}]':
src/hot_tmc.cpp:65:9:   required from here
src/hot_log.hpp:132:19: error: 'printf' was not declared in this scope
  132 |             printf(buffer);
      |             ~~~~~~^~~~~~~~
src/hot_log.hpp:1:1: note: 'printf' is defined in header '<cstdio>'; did you forget to '#include <cstdio>'?
  +++ |+#include <cstdio>
    1 | /* ----------------------------------------------------------------------------
src/hot_log.hpp:134:19: error: 'printf' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
  134 |             printf(std::forward<Params>(params)...);
      |             ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/hot_log.hpp:136:13: error: 'printf' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
  136 |       printf(" %s\r\n", RESET);
      |       ~~~~~~^~~~~~~~~~~~~~~~~~
src/hot_log.hpp: In instantiation of 'void LOG::LogThis(LOG::log_ID, const char*, const char*, int, Params&& ...) [with Params = {const char (&)[32], unsigned char}]':
src/hot_tmc.cpp:69:5:   required from here
src/hot_log.hpp:132:19: error: 'printf' was not declared in this scope
  132 |             printf(buffer);
      |             ~~~~~~^~~~~~~~
src/hot_log.hpp:132:19: note: 'printf' is defined in header '<cstdio>'; did you forget to '#include <cstdio>'?
src/hot_log.hpp:134:19: error: 'printf' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
  134 |             printf(std::forward<Params>(params)...);
      |             ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/hot_log.hpp:136:13: error: 'printf' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
  136 |       printf(" %s\r\n", RESET);
      |       ~~~~~~^~~~~~~~~~~~~~~~~~

因此,确实感觉从 ATMEL/Microchip 的库/驱动程序中加载的“printf()”保留名称 ovlerloading 正在毒化 std 包含的使用。

4

1 回答 1

0

<iostream>给你std::cinstd::cout- 标准输入和标准输出。这些是字符设备。但是 Cortex-M 经常出现在没有操作系统、没有键盘或其他 I/O 的深度嵌入式系统中。<fstream>出于同样的原因,您也可能会发现丢失。

<queue>完全不同。它没有硬件依赖;它应该存在。<mutex>是一个有争议的部分。线程是 C++11 中的新功能,并非所有 Cortex-M 系统都可能具有多核系统。如果没有多核系统,也没有操作系统来进行线程交换,线程和互斥锁将很难实现。

话虽如此,这<queue>意味着您可能会在<queue>构建环境之外使用 Linux 版本。肮脏,但可能可行。

于 2019-10-08T09:42:27.493 回答