我正在撰写一个使用C++11
功能的便携式应用程序,例如std::atomic
,std::threads
等。如何验证我的ARM GCC交叉编译工具链是否支持C++11
标准?
我尝试使用arm-none-linux-gnueabi-g++ -v
和arm-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
答案 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
,
#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
#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 或更好。