Was ist der Unterschied zwischen "Architekturen" und "Gültige Architekturen" in den Xcode-Build-Einstellungen?

112

Was bedeuten sie und kann ich sie auf verschiedene Werte einstellen?

Nordbaum
quelle

Antworten:

113

Architekturen sind diejenigen, die Sie erstellen möchten, gültige Architekturen sind diejenigen, die Sie sich vorstellen können, mit Ihrer Codebasis zu erstellen.

Vielleicht möchten Sie Ihre Binärdatei nur für armv7s erstellen, aber der gleiche Quellcode lässt sich gut für armv7 und armv6 kompilieren. Also VALID_ARCHS = armv6 armv7 armv7s, aber Sie setzen, ARCHS = armv7sweil das alles ist, was Sie tatsächlich mit Ihrem Code erstellen möchten .

Oder in Apple-ese:

ARCHS (Architekturen)

Durch Leerzeichen getrennte Liste von Bezeichnern. Gibt die Architekturen (ABIs, Prozessormodelle) an, auf die die Binärdatei ausgerichtet ist. Wenn diese Build-Einstellung mehr als eine Architektur angibt, kann die generierte Binärdatei Objektcode für jede der angegebenen Architekturen enthalten.

und:

VALID_ARCHS (Gültige Architekturen)

Durch Leerzeichen getrennte Liste von Bezeichnern. Gibt die Architekturen an, für die die Binärdatei erstellt werden kann. Während des Builds wird diese Liste mit dem Wert der ARCHS-Buildeinstellung geschnitten. Die resultierende Liste gibt die Architekturen an, auf denen die Binärdatei ausgeführt werden kann. Wenn die resultierende Architekturliste leer ist, generiert das Ziel keine Binärdatei.

Quelle: Xcode Build Setting Reference

In der Praxis lassen Sie es in VALID_ARCHSRuhe und sorgen sich nicht darum, es zu ändern. Sie müssen nur ARCHSdie Architekturen festlegen, die Sie erstellen möchten. In der Regel setzen Sie einen Debug-Build auf "Just" NATIVE_ARCH, da Sie nur die Debug-Version für den Computer erstellen möchten, auf dem Sie ihn testen / ausführen möchten, und Release-Builds für das gesamte Spektrum der Architekturen, die Sie unterstützen möchten.

Jeremy W. Sherman
quelle
1
@DanMoore Die "resultierende Architekturliste" wird zur Erstellungszeit im Speicher erstellt.
Saltymule
3
@ onmyway133 Meistens möchten Sie VALID_ARCHS nicht. Wenn Sie nur für bestimmte Architekturen Inline-ASM geschrieben haben, können Sie VALID_ARCHS ändern, um anzuzeigen, dass Ihr Code nur noch für diese Architekturen bestimmt ist. Meistens ist es jedoch nur ein Hinweis von Xcode, der angibt, für welche Architekturen es erstellt werden kann , und Sie wählen von dort aus für Ihre ARCHS.
Jeremy W. Sherman
4

Aus dem Apple-Dokument wissen wir, dass der binäre Xcode die Liste ist, mit der Valid Architectures geschnitten wird Architectures.

Ich glaube nicht, dass Jeremys Antwort richtig ist, wie er sagt:

Vielleicht möchten Sie Ihre Binärdatei nur für armv7s erstellen, aber der gleiche Quellcode lässt sich
gut für armv7 und armv6 kompilieren. Also VALID_ARCHS = armv6 armv7 armv7s, aber Sie setzen ARCHS = armv7s, weil das alles ist, was Sie tatsächlich mit Ihrem Code erstellen möchten.

Wenn Sie festlegen VALID_ARCHS = armv6 armv7 armv7sund festlegen ARCHS = armv7s, wird das Ergebnis des binären Xcodes armv7s erstellt. Es kann nicht mit armv6 / armv7 kompatibel sein.

Und wenn Sie mit armv6 / armv7 / armv7s kompatibel sein möchten, müssen Sie einstellen VALID_ARCHS = armv6 armv7 armv7sund ARCHS = armv6. Auf diese Weise wird das Ergebnis des binären Xcodes armv6 erstellt, und es kann auf beiden armv6 / armv7 / armv7s einwandfrei ausgeführt werden, da der Armprozessor abwärtskompatibel ist .

Foogry
quelle
1
Er hatte Recht: "Weil das alles ist, was Sie tatsächlich mit Ihrem Code erstellen möchten ."
Laszlo