检测CPU架构的编译时间

时间:2020-03-06 14:54:37  来源:igfitidea点击:

编译C或者C ++代码时找出CPU体系结构的最可靠方法是什么?据我所知,不同的编译器具有自己的非标准预处理器定义集(MSVS中的_M_X86,GCC中的__i386 __,arm)等等。

有没有检测我要构建的体系结构的标准方法?如果不是的话,是否有针对各种编译器的此类定义的完整列表的来源,例如带有所有#ifdef样板的标头?

解决方案

没有任何标准。布赖恩·胡克(Brian Hook)在他的"便携式开源线束"中记录了其中的许多内容,甚至试图使它们成为连贯且可用的东西(关于这个问题的ymmv)。请参阅此网站上的posh.h标头:

  • http://hookatooka.com/poshlib/

请注意,由于前段时间的DOS攻击,上面的链接可能需要我们输入一些虚假的用户ID /密码。

没有编译器间标准,但是每个编译器都趋于一致。我们可以为自己构建标头,如下所示:

#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif

#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif

列出完整的列表没有什么意义,因为有成千上万的编译器,但被广泛使用的只有3-4个(Microsoft C ++,GCC,Intel CC或者TenDRA?)。只需确定应用程序将支持哪些编译器,列出其#defines并根据需要更新标头即可。

这是有关预定义体系结构宏和其他类型的预定义宏的信息。

这个问题会问它们在GCC源代码中的定义位置。

如果需要对CPU功能进行细粒度的检测,最好的方法是还附带一个将CPU支持的功能集输出到stdout或者一些" cpu_config.h"文件的CPUID程序。然后,我们将该程序与构建过程集成在一起。