2010-05-27 7 views
24

Wenn ich Compiler-Flag -mmacosx-version-min=10.5 überlasse, was bedeutet es? Ich denke, es bedeutet das Ergebnis binär ist x86, nicht ppc, aber ist es 32 oder 64 Bits? Ich kompiliere auf Schneeleopard, so ist die Standardausgabe binär 64 Bit. Ich bin nicht -universal übergeben, es ist nicht 32bit-64bit Universal-Binär, denke ich.Was bedeutet macosx-version-min?

Antwort

19

Diese Option wird von den verschiedenen Verfügbarkeitsmakros in den Headern verwendet. Dies bedeutet, dass Sie eine Mindestversion des Betriebssystems benötigen, auch wenn Sie ein neueres SDK haben (d. H. Target 10.5 mit einem 10.6 SDK). Die Verwendung einer 10.6-API bei der Ausrichtung auf 10.5 löst eine Warnung aus, und die API wird mit einem Attribut "weak_import" verknüpft.

Die meisten Apple-API-Header enthalten die Verfügbarkeit von Makros für jede Klasse, Methoden, Funktionen oder Aufzählungen, um für jeden von ihnen zu erklären:

  • Die minimalen OS
  • Die deprecation unterstützten
  • Die Nichtverfügbarkeit
  • ...

Die Makros wie folgt aussehen:

  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED
  • ...

Was die Architektur, es hängt nur von den verfügbaren Architekturen in den Binärdateien des SDK. Mit einem 10.5 SDK können Sie beispielsweise vier Architekturen (Intel/32Bits, PowerPC/32Bits, Intel/64Bits, PowerPC 64Bits) anvisieren, während Sie mit einem 10.6 SDK nur drei Architekturen (Intel/32Bits, PowerPC/32Bits, Intel/64 Bit).

Wie Sie Snow Leopard verwenden, können Sie entweder Ziel i386 (Intel/32bit), ppc (PowerPC/32 Bit) oder x86_64 (Intel/64bits) sehr einfach durch eine Architektur Option wie folgt übergeben:

gcc -arch i386 

oder so (für configure-basierten Projekte):

CFLAGS="-arch i386" LDFLAGS="-arch i386" ./configure 
+0

Ich musste # enthalten, um diese Makros in Ebene C zu erhalten. Aber available.h ist auch in stdlib.h enthalten –

+1

Siehe auch @ Kristian Antwort unten. Außerdem habe ich festgestellt, dass eine Mindestversion gleich und über 10 ist.8 wird leicht unterschiedliche Symbole erzeugen (die Verknüpfung des '_start' Symbols hat sich geändert, wahrscheinlich in Übereinstimmung mit der neuen Standard C++ Bibliothek). – Ephemera

4

Es löst Compilerwarnungen für Methoden aus, die nach Mac OS X 10.5 erschienen sind. Das hat nichts mit Architektur zu tun.

10

Aus meiner Prüfung, dann ist es auch wichtig, dass diese Option auf den Link Schritt übergeben werden (wie -arch); es wirkt sich also mehr als nur auf Makros/Vorverarbeitung aus (wie aus anderen Antworten hervorgeht).

Bei der Übergabe an den Kompilierungsschritt, aber nicht an den Link-Schritt übergeben, fand ich, dass mit 10.6 gebaute shared libraries nicht unter 10.5 geladen werden.

12

-mmacosx-version-min=... beeinflusst auch die Standardauswahl der C++ - STL-Implementierung (GNU oder LLVM), und in dieser Hinsicht ist es gleichermaßen wichtig für den Compiler und den Linker.

+3

In der Tat. Dies ist besonders wichtig bei Mavericks, wo die Standard-C++ - STL-Lib geändert wurde. –