Jaka jest różnica między „architekturami” a „prawidłowymi architekturami” w ustawieniach kompilacji Xcode?

112

Jakie jest ich znaczenie i czy mogę ustawić je na różne wartości?

Northtree
źródło

Odpowiedzi:

113

Architektury to te, które chcesz zbudować, prawidłowe architektury to te, które możesz wymyślić przy użyciu bazy kodu.

Więc może chcesz zbudować swój plik binarny tylko dla armv7s, ale ten sam kod źródłowy skompilowałby się dobrze dla armv7 i armv6. Tak VALID_ARCHS = armv6 armv7 armv7s, ale ustawiasz, ARCHS = armv7sponieważ to wszystko, co chcesz zbudować za pomocą swojego kodu.

Lub w Apple-ese:

ARCHS (architektury)

Lista identyfikatorów oddzielona spacjami. Określa architektury (ABI, modele procesorów), do których jest przeznaczony plik binarny. Gdy to ustawienie kompilacji określa więcej niż jedną architekturę, wygenerowany plik binarny może zawierać kod obiektowy dla każdej z określonych architektur.

i:

VALID_ARCHS (prawidłowe architektury)

Lista identyfikatorów oddzielona spacjami. Określa architektury, dla których można zbudować plik binarny. Podczas budowania lista ta jest przecinana z wartością ustawienia kompilacji ARCHS; wynikowa lista określa architektury, na których może działać plik binarny. Jeśli wynikowa lista architektur jest pusta, cel nie generuje pliku binarnego.

Źródło: odniesienie do ustawień kompilacji Xcode

W praktyce zostawiasz się w VALID_ARCHSspokoju i nie martwisz się, że go zmieniasz, i po prostu bawisz ARCHSsię, ustawiając architektury, które chcesz zbudować. Zwykle ustawiasz kompilację debugowania na just NATIVE_ARCH, ponieważ chcesz tylko zbudować wersję debugowania dla maszyny, na której będziesz ją testować / uruchamiać, i kompilacje wydania dla pełnego spektrum architektur, które planujesz obsługiwać.

Jeremy W. Sherman
źródło
1
@DanMoore „Wynikowa lista architektur” jest zapisywana w pamięci podczas kompilacji.
Saltymule,
3
@ onmyway133 W większości przypadków nie chcesz VALID_ARCHS. Jeśli pisałeś asm inline tylko dla niektórych architektur, możesz zmienić VALID_ARCHS, aby odzwierciedlić, że twój kod nie jest już przeznaczony dla żadnej innej architektury niż te. Jednak przeważnie jest to tylko wskazówka z Xcode, która wskazuje, dla których architektur może budować, i wybierasz stamtąd dla swojego ARCHS.
Jeremy W. Sherman
4

Z dokumentu Apple wiemy, że binarny Xcode zbuduje listę Valid Architectures przecinaną z Architectures.

Więc nie sądzę, że odpowiedź Jeremy'ego jest właściwa, jak powiedział:

Więc może chcesz zbudować swój plik binarny tylko dla armv7s, ale ten sam kod źródłowy
skompilowałby się dobrze dla armv7 i armv6. Tak więc VALID_ARCHS = armv6 armv7 armv7s, ale ustawiasz ARCHS = armv7s, ponieważ to wszystko, co chcesz zbudować za pomocą swojego kodu.

Kiedy ustawisz VALID_ARCHS = armv6 armv7 armv7si ustawisz ARCHS = armv7s, wynikiem binarnego Xcode będzie armv7s , nie może być kompatybilny z armv6 / armv7.

A jeśli chcesz być kompatybilny z armv6 / armv7 / armv7s , musisz ustawić VALID_ARCHS = armv6 armv7 armv7si ARCHS = armv6.W ten sposób wynik binarnego Xcode to armv6 i może działać dobrze na obu armv6 / armv7 / armv7s, ponieważ procesor arm jest kompatybilny wstecz .

foogry
źródło
1
Miał rację: „ponieważ to wszystko, co chcesz zbudować za pomocą swojego kodu”.
Laszlo