집에서는 M1 Pro 맥북을 사용중이고, 최근 회사에서는 M1 iMac을 사용중인데요.
실리콘 환경에서의 빌드에서 문제가 가끔 발생하여,
이를 해결한 케이스들을 정리해봅니다.
(이 글은 추가 케이스가 생길 때 업데이트될 수 있습니다)
(마지막 업데이트: 2023.01.17)
#1
외부 framework는 가급적 xcframework를 쓰는 것이 좋음.
기존 lipo로 묶는 유니버셜framework는 arm단말용 바이너리+arm시뮬레이터용 바이너리가 묶일수가 없음.
carthage는 0.37.0부터 xcframework를 지원.
#2
터미널(혹은 iterm)을 쓰는 경우 homebrew, npm, pods 등 패키지관리자 설치시 문제가 발생할 수 있는데,
실행할 때 로제타로 실행한 후 설치하면 해결.
(앱 '정보 가져오기' 후 'Rosetta를 사용하여 열기')
#3
프로젝트에 FirebaseCrashlytics를 사용중이고,
빌드시 DSYM을 업로드해주는 스크립트가 세팅되어 있을 때,
아래와 같은 에러가 발생하는 케이스.
(프로젝트 경로)/Pods/FirebaseCrashlytics/run: line 61:
(프로젝트 경로)/Pods/FirebaseCrashlytics/
upload-symbols: Bad CPU type in executable
Command PhaseScriptExecution failed with a nonzero exit code
(#2)케이스와 유사하게, Xcode를 Rosetta로 실행해서 빌드해주면 해결.
⚠️Xcode 14.3부터는 Rosetta로 실행하는 것을 지원하지 않습니다.
#4 (2022.09.25 추가)
pod init 혹은 pod install 시 아래와 같은 에러가 발생할 때,
force_encoding' can't modify frozen string (frozenerror) cocoapods
CocoaPod을 삭제 후 Homebrew를 통해 재설치를 하면 되는데,
일단 1. 터미널에서 CocoaPod을 삭제해주고,
sudo gem uninstall cocoapods
Homebrew로 재설치를 해주기 전에, 아래 명령어 실행해서
brew config
'HOMEBREW_PREFIX' 값이 '/opt/homebrew' 인지 확인.
'/opt/homebrew'가 아니라 '/usr/local'로 되어 있다면?
intel 용으로 Cocoapods 패키지를 설치해주기 위한 여정을 시작.
아래 명령어 실행해주고,
/opt/homebrew/bin/brew doctor
실행 결과에 나오는 echo ~~ 나오는 줄을 복사해서 실행.
echo 'export PATH=" /opt/homebrew/bin:$PATH"! >> ~/.zshre
그러면 이제 brew config의 HOME_BREW가 /opt/homebrew로 적용.
이제 Homebrew로 Cocoapods를 설치
brew install cocoapods
#5 (2023.01.17 추가)
SwiftUI Preview를 적용하여 빌드를 하는데,
다음과 같은 에러가 발생할 때
(mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64'))
| RemoteHumanReadableError
|
| LoadingError: failed to load library at path "/Users/(User명)/Library/Developer/Xcode/DerivedData/(Project명)-...................................(생략).................................... (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64')), ......
이런 에러가 발생한다면 실리콘 맥환경에서 Xcode를 '로제타'로 실행하고 있을 수 있습니다.
저는 회사에서 메인앱 빌드 환경에서 #3문제를 해결하기 위해서 로제타로 Xcode를 사용하고 있었는데,
다른 앱의 새 화면 개발을 위해 Preview를 사용하려고 시도하다가 위 문제의 해결방법을 찾다가 로제타로 실행하면 발생할 수 있는 문제라는 걸 알았습니다. 'Resetta를 사용하여 열기' 체크를 해제하면 바로 해결이 됩니다.
have 'x86_64', need 'arm64' 라는 메세지는 '당신이 로제타로 Xcode를 실행하여 intel(x86_64)용으로 빌드가 되었는데, 시뮬레이터는 실리콘(arm64)용이 필요합니다'라는 의미인 듯?
(참고: https://developer.apple.com/forums/thread/718859)
⚠️Xcode 14.3부터는 Rosetta로 실행하는 것을 지원하지 않습니다.