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

时间:2013-12-13 19:50:25

标签: 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

gcc版本4.6.2

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

ARMV4

#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 或更好。