2010-05-27 5 views
24

Quand je passe du compilateur drapeau -mmacosx-version-min=10.5, qu'est-ce que cela signifie? Je pense que cela implique le résultat binaire est x86, pas ppc, mais est-ce 32 bits ou 64 bits? Je compile sur Snow Leopard, donc la sortie binaire par défaut est 64 bits. Je ne passe pas -universal, ce n'est pas binaire universel 32bit-64bit, je pense.qu'implique macosx-version-min?

Répondre

19

Cette option sera utilisée par les différentes macros de disponibilité placées dans les en-têtes. Cela signifie que vous pouvez avoir besoin d'une version minimale du système d'exploitation, même si vous disposez d'un SDK plus récent (c'est-à-dire la cible 10.5 avec un SDK de 10,6). L'utilisation d'une API 10.6 tout en ciblant 10.5 déclenchera un avertissement et l'API sera liée à un attribut weak_import.

La plupart des en-têtes de l'API d'Apple contient des macros de disponibilité pour chaque classe, des méthodes, des fonctions ou des énumérations afin de déclarer pour chacun d'eux:

  • Le système d'exploitation minimum pris en charge
  • Le deprecation
  • La non-disponibilité
  • ...

Les macros ressemblent:

  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER
  • AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED
  • ...

Quant à l'architecture, il ne dépend que des architectures disponibles dans les binaires du SDK. Par exemple avec un 10.5 SDK, vous pouvez cibler quatre architectures (Intel/32bits, PowerPC/32bits, Intel/64bits, 64bits PowerPC), alors qu'avec un SDK 10.6, vous ne pouvez cibler trois architecture (Intel/32bits, PowerPC/32bits, Intel/64bits).

Comme vous utilisez Snow Leopard, vous pouvez soit i386 cible (Intel/32bits), ppc (PowerPC/32bits) ou x86_64 (Intel/64bits) très simplement en passant une option d'architecture comme celui-ci:

gcc -arch i386 

ou comme celui-ci (pour les projets basés sur configure):

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

J'ai dû #include pour obtenir ces macros en langage C. Mais available.h est également inclus dans stdlib.h –

+1

Voir aussi la réponse @ Kristian ci-dessous. En outre, j'ai trouvé qu'une version minimale égale et supérieure à 10.8 va générer des symboles légèrement différents (la liaison du symbole '_start' a changé, probablement en ligne avec la nouvelle bibliothèque C++ par défaut). – Ephemera

4

Il déclenche des avertissements du compilateur pour les méthodes qui sont apparues après Mac OS X 10.5. Cela n'a rien à voir avec l'architecture.

10

de mes tests, il est également important que cette option soit passée à l'étape de liaison (comme -arch); cela fait donc plus que d'affecter les macros/prétraitements (comme on pourrait le déduire d'autres réponses).

Lorsqu'il est passé à compiler étape mais pas passée à l'étape de liaison, je trouve que les bibliothèques partagées construites avec 10.6 ne chargerait pas inférieure à 10,5.

12

-mmacosx-version-min=... influence également le choix par défaut de l'implémentation STL C++ (GNU ou LLVM), et à cet égard, il est tout aussi important pour le compilateur et l'éditeur de liens.

+3

En effet. Ceci est particulièrement important sur Mavericks, où la bibliothèque C++ STL par défaut a changé. –