2008-09-30 3 views
61

Was ist die zuverlässigste Methode, die CPU-Architektur beim Kompilieren von C- oder C++ - Code zu ermitteln? Soweit ich das beurteilen kann, haben verschiedene Compiler ihre eigene Reihe von Nichtstandard-Präprozessordefinitionen (_M_X86 in MSVS, __i386__, __arm__ in GCC, usw.).Ermitteln der CPU-Architektur Kompilierzeit

Gibt es einen Standard Weg, um 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, wie zum Beispiel eine Kopfzeile mit allen Voreinstellungen #ifdef s?

+0

Im Prinzip baugleich Antwort für Betriebssystemerkennung: http://stackoverflow.com/questions/142508/how-do-i-check-os-with-a-preprocessor-directive –

Antwort

60

Hier sind einige Informationen über Pre-defined Architecture Macros und andere Arten von vordefinierten Makros.

+0

Definiert der C- oder C++ - Standard suggestive Makros, die von verschiedenen Compilern verwendet werden. –

+0

Das scheint richtig, aber kann jemand das GCC-Dokument zitieren, das besagt, dass es es verwendet? –

3

Es gibt nichts Standard. Brian Hook hat einen Haufen davon in seinem "Portable Open Source Harness" dokumentiert und versucht sogar, daraus etwas Kohärentes und Nutzbares zu machen (ymmv). Siehe die posh.h Header auf dieser Seite:

Hinweis, der Link oben können Sie erfordert ein falsches Benutzer-ID/Passwort aufgrund eines DoS-Angriffs vor einiger Zeit einzugeben.

+5

-1, Boo zu Links, die Kennwörter erfordern. – paxos1977

+2

Jeez - Entschuldigung wegen der falschen Verbindung - es sollte http://hookatooka.com/poshlib/ sein, das Informationen über die Benutzer-ID/das Passwort gibt. Mein Browser muss sich bei einem früheren Besuch der Seite automatisch eingeloggt haben. –

+0

Netter Link! :) ..... –

14

Es gibt keinen Inter-Compiler-Standard, aber jeder Compiler neigt dazu, ziemlich konsistent zu sein. Sie können selbst einen Kopf bauen, das ist so etwas wie dieses:

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

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

Es gibt nicht viel Sinn, zu einer umfassenden Liste, weil es Tausende von Compilern sind aber nur 3-4 weit verbreitet (Microsoft C++, GCC, Intel CC , vielleicht TenDRA?). Entscheiden Sie einfach, welche Compiler Ihre Anwendung unterstützt, listen Sie ihre #defines auf und aktualisieren Sie Ihre Kopfzeile nach Bedarf.

+2

Dies funktionierte bei Visual Studio 2010 nicht für mich. '_M_X86' wurde positiv nicht definiert (32-Bit-Build). Der richtige ist '_M_IX86' (Kredit zu Serges Link oben). – Thomas

-2

Wenn Sie eine feinkörnige Erkennung von CPU-Funktionen benötigen, ist der beste Weg, auch ein CPUID-Programm zu liefern, das die von der CPU unterstützten Funktionen an stdout oder einige "cpu_config.h" -Dateien ausgibt. Dann integrieren Sie dieses Programm in Ihren Build-Prozess.

+2

Funktioniert nicht für Cross-Compilierung.Und wie kompilierst du ein CPU-Programm, wenn du nicht weißt, auf welchem ​​Rechner es laufen soll? – jforberg

3

Wenn Sie alle verfügbaren Funktionen auf einer bestimmten Plattform entleeren möchten, könnten Sie GCC wie laufen:

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

Es wäre Dumps Marcos wie #define __SSE3__ 1, #define __AES__ 1 usw.

+0

'-march = native' schlägt für ARM und MIPS für GCC 4.9 und niedriger fehl. – jww