본문 바로가기

프로그래밍/Swift

[Xcode 12] 인텔 맥북과 M1 맥북의 Architecture 차이점(x86_64와 Arm64)

반응형

사건의 발단

6월부터 새로운 iOS 앱을 맡게 되었다. 시니어가 유지 보수하던 우리 회사 가장 잘 나가는(?) 앱인데 사이즈가 꽤나 큰 편이다. 그런데 문제가 생겼다. 첫 빌드부터 잘 안 되는 것이었다. 문제는 한 프레임워크로부터 발생했다.

 

첫 번째 오류

Building for iOS Simulator, but the linked framework 'yourFramework.framework' was built for iOS.

 

해석하자면, '너 지금 iOS 시뮬레이터로 빌드 중인데, 'xxx.framework'라는 프레임워크는 iOS 전용으로 만들어짐.'이라는 뜻인데, 대충 시뮬레이터로는 동작하지 않도록 만들어진 프레임워크라는 뜻인 듯했다. 폭풍 구글 검색 ㄱㄱ

 

헛발질 1

Project > Targets > Build Settings > Validate workspace Yes로 설정

검색결과 솔루션 중 하나는 Validate workspaceYes로 바꾸라는 것이었다. 근데 이 세팅값의 Yes와 No의 차이에 대해선 명확한 설명을 찾기 어려웠다. Validate workspace 세팅에 대한 정의는 아래와 같다.

 

If enabled, perform validation checks on the workspace configuration as part of the build process.

 

즉, 해당 세팅을 활성화하면 빌드시 유효성 검사를 하겠다는 것인데 무슨 유효성 검사? 

 

2019년 WWDC에서 발표된 내용에 따르면 xcode 11부터 새롭게 추가된 XCFramework는 다중 아키텍처나 플랫폼을 한 곳에 묶어서 배포할 수 있는 타입이라고 한다. 어쨌든 기존 framework의 시뮬레이터 사용은 제한하고 새로운 XCFramework를 사용해야 한다는 것이다.

 

아마 XCFramework가 아닌 구식의 framework의 작동을 제한하는 유효성 검사가 아닐까 싶다. 근데 Yes로 설정하면 유효성 검사를 하겠다는 의미이므로 검사를 하면 오히려 유효성 검사에 탈락이라 빌드가 안돼야 하는 거 아닌가?

 

재밌는 건 해당 설정을 Yes로 하든 No로 하든 한번 건들기만 하면 더 이상 Complier Error는 나타나지 않는다. 단지 노란색 경고를 줄 뿐인데... 암튼 해당 설정은 유효성 검사를 할게 아니라 당할 필요가 있어 보이긴 하는데, 뭐 어쨌든 해결만 된다면....?

 

근데 슬프게도 역시나 해결되지 않았고, 또 다른 오류를 만들어 낼 뿐이었다. 역시 XCFramework가 아니라서 안 되는 것일까?

 

두 번째 오류(아키텍쳐 관련)

Could not find module 'xxx' for target 'x86_64-apple-ios-simulator'; found: arm64, armv7-apple-ios, arm64-apple-ios, arm, armv7

 

그러니까... x86_64 아키텍처를 지원하는 모듈을 찾을 수 없고; arm64, armv7-apple-ios... 등을 지원한다는 의미인 것 같다. 도대체 x86_64나 arm64는 뭐란 말인가?

 

일단 arm종류의 아키텍쳐는 iOS 기기에 사용되는 아키텍처다. arm64는 최신 기기들, armv7는 비교적 오래된 기기들에 사용된 다는 점에서 차이는 있지만 기본적으로 iOS 디바이스는 arm 기반으로 작동한다.

 

하지만 맥북에서 작동하는 시뮬레이터는 다르다. 맥북의 인텔 CPU를 사용하기 때문에 시뮬레이터도 인텔의 x86_64의 아키텍처에서 작동한다. 따라서 x86_64의 아키텍처를 포함하지 않은 framework는 x86_64 기반인 시뮬레이터에서 작동할 수 없다는 것이다. 그래서 정말 해당 framework가 x86_64를 지원하지 않는지 확인해봤다.

lipo -info yourFramework.framework/yourFramework 
Architectures in the fat file: yourFramework.framework/yourFramework are: armv7 arm64 

정말 해당 framework는 arm 류 밖에 지원하지 않았다. 이러면 인텔기반인 맥북의 시뮬레이터에서 작동시킬 수 없다. 그럼 방법은 정말 없는 걸까?

 

 

헛발질 2

문제는 x86_64를 지원하지 않는 framework이므로 시뮬레이터가 arm64 기반이라면 얘기가 다르지 않을까?

 

그렇다. 인텔 맥북은 x86_64 기반의 시뮬레이터를 동작시키지만 arm기반인 silicon M1칩 맥북이라면 동작할 것이라고 판단했다. 물론 내가 사용하는 맥북도 M1이지만 이전에는 Rosetta를 통해 x86_64 아키텍처로 변환해서 사용했지만 Rosetta를 해제하고 시도해보기로 했다.

 

다만 M1 맥북 시뮬레이터는 x86_64와 arm64 둘 다 지원하기 때문에 Build Settings에서 Excluded Architectures에 x86_64를 추가해주어 x86_64가 작동하지 않도록 해야 했다.

기존 x86_64로 컴파일
Excluded Architectures에 x86_64를 추가 후 arm64로 컴파일

 

그럼 해결이 되었을까? 결론적으로 이 방법으로도 빌드되지 않았다. arm64 시뮬레이터에서는 작동할 거라고 생각했는데 작동되지 않는 것을 보니 아키텍처 문제가 아니라 근본적으로 Xcode에서 arm64 기반 framework를 더 이상 허용하지 않는 것 같다.

 

building for iOS Simulator, but linking in dylib built for iOS, file '/yourFramework.framework/yourFramework' for architecture arm64

 

 

결론

사실 그냥 실제 디바이스에 빌드하면 문제가 해결된다. 실제 디바이스는 arm64 기반이라 아키텍처 문제가 생기지 않는다. 만약 그래도 시뮬레이터에 돌리고 싶다면 결국 framework를 XCFramework로 변환해야 한다. 변환은 해당 framework를 만든 개발자를 통해서 해결해야 한다.

 

 

[참고]

반응형

'프로그래밍 > Swift' 카테고리의 다른 글

[swift] 클래스  (0) 2021.07.05
[swift] 함수와 클로저  (0) 2021.06.07
[Swift] 조건문과 반복문  (0) 2021.05.27
[Swift] 변수 선언  (0) 2021.05.26
Swift가 안전한 언어인 이유?  (0) 2021.03.15