Was ist der zuverlässigste Weg, um die CPU-Architektur beim Kompilieren von C- oder C ++ - Code herauszufinden? Soweit ich das _M_X86
beurteilen 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
?
c++
c
detection
cpu-architecture
compile-time
Alex B.
quelle
quelle
Antworten:
Hier finden Sie einige Informationen zu vordefinierten Architekturmakros und anderen Arten von vordefinierten Makros.
Diese Frage fragt, wo sie im GCC-Quellcode definiert sind .
quelle
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.
quelle
_M_X86
wurde definitiv nicht definiert (32-Bit-Build). Die richtige ist_M_IX86
(Gutschrift auf Serges Link oben).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__ 1
usw.quelle
-march=native
schlägt für ARM und MIPS für GCC 4.9 und niedriger fehl.Wenn Sie eine Cross-Compiler-Lösung wünschen, verwenden Sie einfach die,
Boost.Predef
die enthältBOOST_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
quelle
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.
quelle
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.
quelle