Erkennen der Kompilierungszeit der CPU-Architektur

81

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

Gibt es eine Standardmethode zum Erkennen der Architektur, für die ich baue? Wenn nicht, gibt es eine Quelle für eine umfassende Liste solcher Definitionen für verschiedene Compiler, z. B. einen Header mit allen Boilerplates #ifdef?

Alex B.
quelle
1
Grundsätzlich die gleiche Antwort für die Betriebssystemerkennung: stackoverflow.com/questions/142508/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Antworten:

78

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

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

Serge
quelle
Definiert der C- oder C ++ - Standard alle suggestiven Makros, die von verschiedenen Compilern verwendet werden sollen?
Krishna Oza
Dies scheint richtig zu sein, aber kann jemand das GCC-Dokument zitieren, das besagt, dass es es verwendet?
Ciro Santilli 法轮功 冠状 病 六四 事件 20
15

Es gibt keinen Inter-Compiler-Standard, aber jeder Compiler ist in der Regel ziemlich konsistent. Sie können sich einen Header 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

Eine umfassende Liste hat nicht viel Sinn, da es Tausende von Compilern gibt, aber nur 3-4 weit verbreitet sind (Microsoft C ++, GCC, Intel CC, vielleicht TenDRA?). Entscheiden Sie einfach, welche Compiler Ihre Anwendung unterstützt, listen Sie deren #defines auf und aktualisieren Sie Ihren Header nach Bedarf.

John Millikin
quelle
4
Dies hat bei mir in Visual Studio 2010 nicht funktioniert. Es _M_X86wurde definitiv nicht definiert (32-Bit-Build). Die richtige ist _M_IX86(Gutschrift auf Serges Link oben).
Thomas
6

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 Dump - Makros wie #define __SSE3__ 1, #define __AES__ 1usw.

Wei Shen
quelle
-march=nativeschlägt für ARM und MIPS für GCC 4.9 und niedriger fehl.
JWW
4

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

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

Zum Beispiel

#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

Weitere Informationen zur Verwendung finden Sie hier

phuclv
quelle
3

Es gibt nichts Standard. Brian Hook hat einige davon in seinem "Portable Open Source Harness" dokumentiert und versucht sogar, sie zu etwas Kohärentem und Verwendbarem zu machen (ymmv in Bezug darauf). Siehe den posh.h-Header auf dieser Site:

Hinweis: Für den obigen Link müssen Sie möglicherweise aufgrund eines DOS-Angriffs vor einiger Zeit eine falsche Benutzer-ID / ein falsches Kennwort eingeben.

Michael Burr
quelle
2
Herrgott - Entschuldigung für den falschen Link - es sollte sich um hookatooka.com/poshlib handeln , das Informationen über die Benutzer-ID / das Kennwort enthält. Mein Browser muss sich von einem früheren Besuch auf der Seite automatisch angemeldet haben.
Michael Burr
2
Es ist auch erwähnenswert ... Die Autoren der Website gaben an, warum sie ein Passwort hinzugefügt haben: "Ich entschuldige mich für die Unannehmlichkeiten, aber aufgrund eines unerklärlichen DDoS-Angriffs auf unseren früheren direkten Link mussten wir diese Seite erstellen, um ' Puffer 'gegen die DDoS ... " Ich bin nicht sicher, ob es fair ist, Michael dafür zu bestrafen.
JWW
-2

Wenn Sie eine feinkörnige Erkennung von CPU-Funktionen benötigen, ist es am besten, auch ein CPUID-Programm zu liefern, das die von der CPU unterstützten Funktionen an stdout oder eine Datei "cpu_config.h" ausgibt. Dann integrieren Sie dieses Programm in Ihren Erstellungsprozess.

zvrba
quelle
3
Funktioniert nicht für das Cross-Compilieren. Und wie kompilieren Sie ein CPU-Programm, wenn Sie nicht wissen, auf welchem ​​Computer es ausgeführt werden muss?
Jforberg