我有一個輕微的問題,我不確定如何解決。使用ONLY_ACTIVE_ARCH在編譯本地計算機時沒有遇到編譯警告=否
在我們的多個項目中,我們希望將「將警告視爲錯誤」(GCC_TREAT_WARNINGS_AS_ERRORS
)更改爲YES
。
我們也想離開的Xcode的默認項目設置「只建有源體系」(ONLY_ACTIVE_ARCH
),以YES
用於調試和NO
發佈。
然而,這有一個主要缺點。代碼如...
NSUInteger bob = 12234;
NSLog(@"bob %lu", bob);
應該產生以下類型的警告(因此在我們的例子錯誤):類型NSUInteger「的
價值不應該被用來作爲格式參數; 添加一個顯式的「無符號長」,而不是
然而,當開發人員構建和本地測試,他們沒有遇到此警告/錯誤,但是當他們承諾我們的倉庫,我們的持續集成在命令行中運行xcodebuild
遇到警告並且其構建失敗。這顯然很令人沮喪。
我認爲這與使用Xcode時構建的架構和使用命令行中的xcodebuild
時的區別有關。
我已上載這裏的示例項目...
https://github.com/OliverPearmain/ArchitectureDependantCompileWarning
我已經包括2種方案。如果您使用「ArchitectureDependantCompileWarning」(使用Debug構建配置,因此使用ONLY_ACTIVE_ARCH==YES
)編譯iPhone 6S模擬器,則不會收到警告,並且編譯正常。如果您使用「ArchitectureDependantCompileWarning-FAILS」方案(使用發佈版本配置並因此使用ONLY_ACTIVE_ARCH==NO
),則會遇到警告並且編譯失敗。
我想以某種方式確保在爲模擬器構建ONLY_ACTIVE_ARCH==NO
時始終遇到此警告。這可能嗎?
我會認爲這是不可能的,但我可能是錯的。發生此警告是因爲在期望'unsigned long'時傳遞'unsigned int'。所以當'NSUInteger'是'unsigned long'時,它看起來都很好。我可以想象,如果標記文件無效(無論這可能意味着什麼),那麼可以調整構建過程以在成功構建結束時爲每個所需架構創建某種標記文件,並且版本控制會拒絕提交 - 如果標籤文件比所有源文件更新,那麼標籤文件是否有效?)。 –
我一直能夠捕捉到這些的唯一方法是始終爲「通用iOS設備」構建,即使在調試模式下,它也具有與ONLY_ACTIVE_ARCH = NO相同的實際效果(據我所知)。但是如果你打算這麼做的話,那麼即使是在調試模式下,也可以爲所有拱形構建它,這顯然很不方便。也許調整你的本地單元測試目標(我假設開發者在本地運行之前運行)爲所有拱形構建? – Palpatim
根據一些實際的建議,%zd將在任何體系結構上正確打印NSInteger並沒有警告,因此使用%zd將是一個好習慣。 – gnasher729