Mam niewielki problem, którego nie jestem pewien.Ostrzeżenie o kompilacji nie jest wyświetlane podczas kompilowania na komputerze lokalnym z ONLY_ACTIVE_ARCH = NIE
W naszych wielu projektach chcielibyśmy zmienić "Traktuj ostrzeżenia jako błędy" (GCC_TREAT_WARNINGS_AS_ERRORS
) na YES
.
Chcielibyśmy również pozostawić domyślne ustawienie projektu Xcode "Buduj tylko aktywną architekturę" (ONLY_ACTIVE_ARCH
) na YES
dla debugowania i NO
dla wydania.
Ma to jednak jedną WIELKĄ wadę. Kod takie jak ...
NSUInteger bob = 12234;
NSLog(@"bob %lu", bob);
powinna przedstawić następujące rodzaje ostrzegawcze (a więc błąd w naszym przypadku):
wartości typu „NSUInteger” nie powinny być wykorzystywane jako argumenty formacie; dodać wyraźnie obsady do „unsigned long” zamiast
jednak gdy deweloperzy budują i testowanie lokalnie oni nie napotykają To ostrzeżenie/błąd ale kiedy zobowiązać się do repozytorium i nasza ciągła integracja przebiega xcodebuild
z wiersza poleceń pojawia się ostrzeżenie, a ich kompilacja nie powiedzie się. Jest to oczywiście frustrujące.
Zakładam, że ma to coś wspólnego z różnicą między budową architektury podczas korzystania z Xcode a korzystaniem z xcodebuild
z wiersza poleceń.
Wysłałem przykładowy projekt tutaj ...
https://github.com/OliverPearmain/ArchitectureDependantCompileWarning
podaję 2 schematów. Jeśli skompilujesz dla symulatora iPhone 6S przy użyciu "ArchitectureDependantCompileWarning" (który używa konfiguracji kompilacji Debug, a tym samym ONLY_ACTIVE_ARCH==YES
), nie otrzymasz ostrzeżenia, a rzeczy będą się dobrze kompilować. Jeśli użyjesz schematu "ArchitectureDependantCompileWarning-FAILS" (który używa konfiguracji wydania wersji, a tym samym ONLY_ACTIVE_ARCH==NO
), to napotkasz ostrzeżenie i kompilacja się nie powiedzie.
Chciałbym jakoś zapewnić, że to ostrzeżenie ZAWSZE napotykane podczas budowania symulatora z ONLY_ACTIVE_ARCH==NO
. czy to możliwe?
Zakładam, że nie jest to możliwe, ale mogę się mylić. Ostrzeżenie pojawia się, ponieważ 'unsigned int' jest przekazywana, gdy oczekiwany jest' unsigned long'. Więc gdy 'NSUInteger' jest' unsigned long' to wszystko wygląda dobrze. Mogę sobie wyobrazić, że można dopasować proces kompilacji do utworzenia jakiegoś pliku znacznika dla każdej wymaganej architektury na końcu udanej kompilacji, a kontrola wersji odrzuca zatwierdzenie, jeśli pliki znaczników nie są poprawne (cokolwiek to może oznaczać w szczegółach - może plik znacznika jest poprawny, jeśli jest nowszy niż wszystkie pliki źródłowe?). –
Jedynym sposobem, w jaki udało mi się to złapać, jest zawsze budowanie "ogólnego urządzenia iOS" nawet w trybie debugowania, który ma taki sam efekt praktyczny (jak ja to rozumiem) jako ONLY_ACTIVE_ARCH = NO. Ale jeśli masz zamiar to zrobić, równie dobrze możesz zbudować go dla wszystkich łuków nawet w trybie debugowania, co jest oczywiście niewygodne. Być może dostosuj lokalny cel testowy jednostki (który, jak zakładam, deweloperzy działają lokalnie przed zatwierdzeniem), aby zbudować dla wszystkich łuków? – Palpatim
Jako pewna praktyczna rada,% zd wydrukuje NSInteger poprawnie i bez ostrzeżenia na dowolnej architekturze, więc używanie% zd będzie dobrym nawykiem. – gnasher729