it-swarm.com.de

Ermitteln der Kompilierungszeit der CPU-Architektur

Was ist der zuverlässigste Weg, um die CPU-Architektur beim Kompilieren von C- oder C++ - Code herauszufinden? Soweit ich das beurteilen kann, haben verschiedene Compiler ihre eigenen nicht standardmäßigen Präprozessordefinitionen (_M_X86 In MSVS, __i386__, __arm__ In GCC usw.).

Gibt es eine Standard Möglichkeit, die Architektur zu erkennen, für die ich baue? Wenn nicht, gibt es eine Quelle für eine umfassende Liste solcher Definitionen für verschiedene Compiler, z. B. eine Kopfzeile mit allen #ifdef - Werten?

76
Alex B

Hier finden Sie einige Informationen zu Vordefinierte Architekturmakros und anderen Arten von vordefinierten Makros.

Diese Frage fragt, wo sie definiert sind im GCC-Quellcode.

72
Serge

Es gibt keinen Inter-Compiler-Standard, aber jeder Compiler neigt dazu, ziemlich konsistent zu sein. Sie können einen Header für sich selbst erstellen, der ungefähr so ​​aussieht:

#if MSVC
#ifdef _M_X86
#define Arch_X86
#endif
#endif

#if GCC
#ifdef __i386__
#define Arch_X86
#endif
#endif

Es macht nicht viel Sinn, eine umfassende Liste zu erstellen, denn es gibt Tausende von Compilern, aber nur 3-4, die weit verbreitet sind (Microsoft C++, GCC, Intel CC, vielleicht TenDRA?). Entscheiden Sie einfach, welche Compiler von Ihrer Anwendung unterstützt werden, listen Sie deren #Definitionen auf und aktualisieren Sie Ihren Header nach Bedarf.

15
John Millikin

Wenn Sie alle verfügbaren Funktionen auf einer bestimmten Plattform sichern möchten, können Sie GCC wie folgt ausführen:

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

Es würde Makros wie #define __SSE3__ 1, #define __AES__ 1, etc.

5
Wei Shen

Wenn Sie eine Cross-Compiler-Lösung wünschen, verwenden Sie einfach Boost.Predef welches enthält

  • BOOST_Arch_ für System-/CPU-Architektur, für die kompiliert wird.
  • BOOST_COMP_ für den Compiler verwendet man.
  • BOOST_LANG_ für Sprachstandards, gegen die kompiliert wird.
  • BOOST_LIB_C_ und BOOST_LIB_STD_ für die verwendete C- und C++ - Standardbibliothek.
  • BOOST_OS_ für das Betriebssystem, zu dem wir kompilieren.
  • BOOST_PLAT_ für Plattformen auf Betriebssystemen oder Compilern.
  • BOOST_ENDIAN_ für die Endlichkeit der Kombination aus Betriebssystem und Architektur.
  • BOOST_HW_ für hardwarespezifische Funktionen.
  • BOOST_HW_SIMD für die SIMD-Erkennung (Single Instruction Multiple Data).

Beispielsweise

#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

Sie können mehr darüber erfahren, wie man es benutzt hier

4
phuclv

Es gibt nichts Standard. Brian Hook hat einige davon in seinem "Portable Open Source Harness" dokumentiert und versucht sogar, sie in etwas Kohärentes und Verwendbares zu verwandeln (ymmv diesbezüglich). Siehe den posh.h-Header auf dieser Site:

Beachten Sie, dass Sie über den obigen Link aufgrund eines DOS-Angriffs vor einiger Zeit möglicherweise eine falsche Benutzer-ID oder ein falsches Kennwort eingeben müssen.

3
Michael Burr