我正在编写一个可移植应用程序,它使用 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
海湾合作委员会版本 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/