TL; DR;
릴리스 모드 에서도 라이브러리 / 앱에 대해 "Build Active Architecture Only ( ONLY_ACTIVE_ARCH
)"를 예로 설정하십시오.
문제의 근본 원인을 확인하는 동안 Xcode 12에 대한 재미있는 사실을 깨달았습니다.
Xcode 12는 안타깝게도 아직 사용할 수없는 Apple Silicon의 디딤돌입니다. 그러나이 플랫폼을 사용하면 현재 Intel 기반 x86_64 아키텍처와 달리 시뮬레이터가 arm64 아키텍처에서도 실행되는 arm64 기반 macOS를 얻을 수 있습니다.
Xcode는 일반적으로 라이브러리 / 앱을 빌드하기 위해 "실행 대상"에 의존합니다. 따라서 시뮬레이터가 "실행 대상"으로 선택되면 사용 가능한 시뮬레이터 아키텍처에 대한 앱을 빌드하고 장치가 "실행 대상"으로 선택되면 장치가 지원하는 아키텍처에 대해 빌드합니다 ( arm*
).
xcodebuild
, Xcode 12+ 빌드 시스템 arm64
에서 시뮬레이터의 유효한 아키텍처로 간주 합니다. 따라서 시뮬레이터가 실행 대상으로 선택되면 잠재적 arm64
으로 기반 시뮬레이터 에 대해 libs / apps를 컴파일 / 링크 할 수 있습니다 (아직 사용할 수 없음). 따라서 <architecture>-<os>-<sdk>-<platform> 형식과 clang(++)
같은 일부 -target 플래그를 보내고 arm64-apple-ios13.0-simulator
clang은 결국 Intel 기반 Mac에서 실패하는 arm64 기반 시뮬레이터에 대해 빌드 / 링크를 시도합니다.
그러나 릴리스 빌드 xcodebuild
에만 이것을 시도 합니다. 왜? "Build Active Architecture Only ( )"빌드 설정은 일반적으로 "Release"구성에 대해서만 "No"로 설정되기 때문입니다. 즉 , 릴리스 빌드를 위해 선택한 실행 대상에 대한 libs / apps의 모든 아키텍처 변형을 빌드하려고합니다. 그리고 시뮬레이터 실행 대상에 대해, 그것은 모두 포함 의지 와 지금을, 이후 엑스 코드 12 +도 시뮬레이터에 대해 지원되는 아키텍처에 애플 실리콘을 지원합니다.ONLY_ACTIVE_ARCH
xcodebuild
x86_64
arm64
arm64
간단히 말해서 Xcode는 명령 줄 xcodebuild
(기본적으로 릴리스 빌드, 프로젝트 설정의 일반 탭 참조)을 시도 하거나 실행 대상에서 지원하는 모든 아키텍처 변형을 빌드하려고 할 때마다 앱 빌드에 실패 합니다 . 따라서이 문제에 대한 간단한 해결 방법 은 릴리스 모드의 경우에도 라이브러리 / 앱에서 "Build Active Architecture Only ( ONLY_ACTIVE_ARCH
)"를 예로 설정하는 것입니다.
라이브러리가 Pod로 포함되어 있고 액세스 권한이있는 경우 .podspec
다음을 간단히 설정할 수 있습니다.
spec.pod_target_xcconfig = { 'ONLY_ACTIVE_ARCH'=> 'YES'}
spec.user_target_xcconfig = { 'ONLY_ACTIVE_ARCH'=> 'YES'} # 권장하지 않음
포드가 대상 프로젝트를 오염시키지 않아야 하고 대상 설정 자체에서 재정의 될 수 있기 때문에 개인적으로 두 번째 줄이 마음에 들지 않습니다 . 따라서 어떤 방식 으로든 설정을 재정의하는 것은 소비자 프로젝트의 책임이어야합니다. 그러나 이것은 podspec의 성공적인 linting을 위해 필요할 수 있습니다.
그러나에 대한 액세스 권한이없는 경우 .podspec
포드를 설치하는 동안 언제든지 설정을 업데이트 할 수 있습니다.
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
end
end
end
내가 실제로 libs / apps를 보관할 때 이것의 영향에 대해 걱정했던 한 가지는. 앱을 보관하는 동안 일반적으로 "Release"구성을 사용하며 현재 실행 대상의 활성 아키텍처 만 고려하여 릴리스 빌드를 생성하므로이 접근 방식을 사용하면 대상 빌드에서 armv7, armv7s 등의 슬라이스가 손실 될 수 있습니다. 그러나 문서에는 특정 아키텍처를 정의하지 않았기 때문에 "Generic iOS Device / Any Device"를 실행 대상으로 선택하면이 설정이 무시된다는 내용이 있습니다 (첨부 된 그림에서 강조 표시됨). 따라서 실행 대상으로 선택하여 앱을 보관하면 좋을 것 같습니다.