Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测CPU体系结构编译时 当编译C或C++代码时,最可靠的方法是找出CPU结构?据我所知,不同的编译器都有自己的一套非标准预处理器定义(MSV中的\u M_X86、GCC中的\uuuuuuui386\uuuuuuu、等等)_C++_C_Detection_Cpu Architecture_Compile Time - Fatal编程技术网

检测CPU体系结构编译时 当编译C或C++代码时,最可靠的方法是找出CPU结构?据我所知,不同的编译器都有自己的一套非标准预处理器定义(MSV中的\u M_X86、GCC中的\uuuuuuui386\uuuuuuu、等等)

检测CPU体系结构编译时 当编译C或C++代码时,最可靠的方法是找出CPU结构?据我所知,不同的编译器都有自己的一套非标准预处理器定义(MSV中的\u M_X86、GCC中的\uuuuuuui386\uuuuuuu、等等),c++,c,detection,cpu-architecture,compile-time,C++,C,Detection,Cpu Architecture,Compile Time,是否有一种标准的方法来检测我正在构建的体系结构?如果没有,是否有各种编译器的此类定义的完整列表的来源,例如包含所有样板文件的标题#ifdefs?没有标准。Brian Hook在他的“便携式开源工具”中记录了其中的一系列内容,甚至试图使它们成为连贯和可用的东西(关于这一点,ymmv)。请参阅本网站上的posh.h标题: 注意,由于前一段时间的DOS攻击,上面的链接可能要求您输入一些伪造的用户ID/密码。没有编译器间标准,但每个编译器往往非常一致。您可以为自己构建一个标题,如下所示: #if

是否有一种标准的方法来检测我正在构建的体系结构?如果没有,是否有各种编译器的此类定义的完整列表的来源,例如包含所有样板文件的标题
#ifdef
s?

没有标准。Brian Hook在他的“便携式开源工具”中记录了其中的一系列内容,甚至试图使它们成为连贯和可用的东西(关于这一点,ymmv)。请参阅本网站上的posh.h标题:


注意,由于前一段时间的DOS攻击,上面的链接可能要求您输入一些伪造的用户ID/密码。

没有编译器间标准,但每个编译器往往非常一致。您可以为自己构建一个标题,如下所示:

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

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

对于综合列表没有多大意义,因为有成千上万的编译器,但只有3-4的广泛使用(微软C++,GCC,英特尔CC,也许TenDRA?)。只需决定应用程序将支持哪些编译器,列出它们的#定义,并根据需要更新标头。

以下是有关和其他类型预定义宏的一些信息


这个问题在GCC源代码中出现。

如果您需要对CPU功能进行细粒度检测,最好的方法是同时提供一个CPUID程序,该程序将CPU支持的功能集输出到标准输出或一些“CPU_config.h”文件。然后将该程序与构建过程集成。

如果要在特定平台上转储所有可用功能,可以运行GCC,如:

gcc -march=native -dM -E - </dev/null

gcc-march=native-dM-E-如果您想要一个交叉编译器解决方案,那么只需使用包含

  • BOOST\u ARCH\u
    对于系统/CPU架构,我们正在编译
  • BOOST\u COMP\u
    用于正在使用的编译器
  • BOOST\u LANG\uz
    对于编译所依据的语言标准
  • >代码> BooStLyLbbcC<和BooStLILBYSTDZ,用于使用的C和C++标准库。
  • BOOST\u OS\u
    用于我们正在编译的操作系统
  • BOOST\u PLAT\u
    用于操作系统或编译器之上的平台
  • BOOST\u ENDIAN\u
    用于操作系统和体系结构组合的持久性
  • BOOST_-HW_
    了解硬件特定功能
  • BOOST_HW_SIMD
    用于单指令多数据(SIMD)检测
比如说

#if defined(BOOST_ARCH_X86)
    #if BOOST_ARCH_X86_64
        std::cout << "x86_64 " << BOOST_ARCH_X86_64 << " \n";
    #elif BOOST_ARCH_X86_32
        std::cout << "x86 " << BOOST_ARCH_X86_32 << " \n";
    #endif
#elif defined(BOOST_ARCH_ARM)
    #if _M_ARM
        std::cout << "ARM " << _M_ARM << " \n";
    #elif _M_ARM64
        std::cout << "ARM64 " << _M_ARM64 << " \n";
    #endif
#endif
#如果已定义(BOOST_ARCH_X86)
#如果是BOOST\u ARCH\u X86\u 64

享受吧,我是这本书的原作者

extern "C" {
    const char *getBuild() { //Get current architecture, detectx nearly every architecture. Coded by Freak
        #if defined(__x86_64__) || defined(_M_X64)
        return "x86_64";
        #elif defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86)
        return "x86_32";
        #elif defined(__ARM_ARCH_2__)
        return "ARM2";
        #elif defined(__ARM_ARCH_3__) || defined(__ARM_ARCH_3M__)
        return "ARM3";
        #elif defined(__ARM_ARCH_4T__) || defined(__TARGET_ARM_4T)
        return "ARM4T";
        #elif defined(__ARM_ARCH_5_) || defined(__ARM_ARCH_5E_)
        return "ARM5"
        #elif defined(__ARM_ARCH_6T2_) || defined(__ARM_ARCH_6T2_)
        return "ARM6T2";
        #elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__)
        return "ARM6";
        #elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
        return "ARM7";
        #elif defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
        return "ARM7A";
        #elif defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
        return "ARM7R";
        #elif defined(__ARM_ARCH_7M__)
        return "ARM7M";
        #elif defined(__ARM_ARCH_7S__)
        return "ARM7S";
        #elif defined(__aarch64__) || defined(_M_ARM64)
        return "ARM64";
        #elif defined(mips) || defined(__mips__) || defined(__mips)
        return "MIPS";
        #elif defined(__sh__)
        return "SUPERH";
        #elif defined(__powerpc) || defined(__powerpc__) || defined(__powerpc64__) || defined(__POWERPC__) || defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC)
        return "POWERPC";
        #elif defined(__PPC64__) || defined(__ppc64__) || defined(_ARCH_PPC64)
        return "POWERPC64";
        #elif defined(__sparc__) || defined(__sparc)
        return "SPARC";
        #elif defined(__m68k__)
        return "M68K";
        #else
        return "UNKNOWN";
        #endif
    }
}

Jeez-很抱歉有虚假链接-应该是提供用户ID/密码信息的链接。我的浏览器必须在以前访问该页面时“自动登录”。这也值得注意。。。该网站的作者解释了为什么他们添加了密码:“对于给您带来的不便,我深表歉意,但由于我们之前的直接链接受到了无法解释的DDoS攻击,我们不得不创建此页面以“缓冲”DDoS…”我不确定惩罚Michael是否公平。这在Visual Studio 2010上对我不起作用<代码>\u M_X86
未明确定义(32位生成)。正确的是<代码> MyIX86/COD>(信用证上面的瑟奇链接)。C或C++标准是否定义了不同编译器使用的任何暗示的宏。这似乎是正确的,但是有人引用GCC文档来说明它是否使用它?基本上是OS检测的相同答案:对于交叉编译来说是不起作用的。除非您知道需要在哪台机器上运行cpuid程序,否则如何编译cpuid程序?
-march=native
对于GCC 4.9及以下版本的ARM和MIPS失败。您的ARM字符串将ARM CPU名称与ARM ISA修订版混淆,如。使用正确的arm7版本更新了帖子。与powerpc64检测属性一样,这意味着您应该在返回“ARMv7”或“ARMv7A”或任何内容时返回“ARM7”。在ARM中,“v”在区分特定ARM核心模型与ISA版本之间的差异方面很重要。请记住,查看打印此字符串的程序的人只会看到他们机器上的一个字符串,而不是整个表,这表明它可能是“ARM6T2”(更清楚地说,这只是ARMv6T2的损坏,而不是CPU型号)