c++ - 如何检查 arm-none-linux-gnueabi-g++ 对 C++11 的支持

标签 c++ gcc arm cross-compiling

我正在编写一个可移植应用程序,它使用 C++11 功能,如 std::atomicstd::threads 等。如何验证我的 ARM GCC 交叉编译器工具链是否支持 C++11 标准?

我尝试使用 arm-none-linux-gnueabi-g++ -varm-none-linux-gnueabi-g++ --version 但在使用 -std=c++11

时返回错误

编辑 # arm-linux-gnueabi-g++ -std=c++11 dum.cpp

cc1plus: 错误: 无法识别的命令行选项 '-std=c++11'

目标:arm-linux-gnueabi

海湾合作委员会版本 4.6.2

最佳答案

cxx0x support matrix . ARM Linux 以标准方式支持大多数功能。特定机器可能不支持某项功能是可能的。即,gcc 版本、linux 版本和 glibc 版本以及 CPU 类型都可以发挥作用。

测试 define __VERSION__ 看看编译器是否支持它。非常非常旧的 Linux 版本可能无法支持某些 CPU 类型; ARMv5 及更早版本。较新的 ARM CPU 有一些总线锁定指令,并且可以在没有任何或很少操作系统支持的情况下支持它。

echo | g++ -dM -E - | grep -i atomic

应该给出一个定义列表。如果您使用 -march=armv7 进行编译,您将获得最大的运气。然而,对于更新的 Linux 版本(以及针对此版本的编译器/glibc),即使是 -march=armv5 也可以在非 SMP 系统上运行。我认为 ARMv5 SMP 系统不可能存在。

如您所见,有许多工作部件,并且某些功能可能只知道在运行时工作。提供 list 可能是不可能的;您需要一个至少具有支持矩阵的 gcc 版本才能使该功能正常工作。

例如,使用相同的编译器但只有 -march=armv4-march=armv6

ARM v4

#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 1
#define __GCC_ATOMIC_LONG_LOCK_FREE 1
#define __GCC_ATOMIC_POINTER_LOCK_FREE 1
#define __GCC_ATOMIC_INT_LOCK_FREE 1

armv6

#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __GCC_ATOMIC_LONG_LOCK_FREE 2

大多数现代智能手机都具有 armv7 或更高版本。

关于c++ - 如何检查 arm-none-linux-gnueabi-g++ 对 C++11 的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20574808/

相关文章:

c++ - C++ 库之间的差异(命名空间、链接)

javascript - 从 C++ 调用 javascript 函数

c - Gcc编译器C字符串赋值问题

linux - 在 Linux-PowerPC 上使用 GCC 连接到 DB2/400

assembly - 汇编中的 ARM/Thumb 互操作

c++ - 如何在预定义的字符串中添加一个字符?

c++ - C C++ 函数名冲突和崩溃不一致

gcc - 可以使gcc/gcov将coverage统计信息输出到源文件夹以外的位置吗?

c++ - 交叉编译c++到iphone arm

c++ - 嵌入式 C++ (ARM9) 单元测试