앱스토어 심사에서, 아이패드 기기에서 UI가 깨지는 오류가 발견돼 해결하기 위해 아이패드 시뮬레이터를 키려 했지만 다음과 같은 빌드 오류를 만나게 되었다.
Could not find module 'SDK모듈이름' for target 'arm64-apple-ios-simulator'; found: arm64-apple-ios, at: 프로젝트폴더/SDK모듈이름.framework/Modules/SDK모듈이름.swiftmodule
프로젝트를 진행할 때 UI작업을 먼저 진행하면서 시뮬레이터를 사용해 확인하고, 사내 SDK를 삽입한 이후에 구현을 하면서는 실기기로 테스트를 했다 보니 시뮬레이터가 동작하지 않는다는 것을 몰랐던 것이다.
(오류환경 : Macbook M1, Xcode 14.3)
에러 원인은 arm64 아키텍처의 iOS 시뮬레이터 모듈이 프레임워크에 내장되어 있지 않았기 때문에 발생한 오류였다.
(자세한 설명은 링크를 참고)
lipo 명령어를 통해 각각의 프레임워크 빌드파일의 아키텍처를 하나로 합쳐 넣어주는 방법이다.
아이폰 실기기 빌드파일은 arm64 아키텍처, mac의 시뮬레이터 빌드파일은 arm64/x84_64 아키텍처로 구성되어 있다. 각각의 빌드 파일을 하나로 합쳐서 사용하는 방법을 시도하였다.
두개의 프레임워크 파일을 한 폴더에 구분해서 가져옴
(simul은 시뮬레이터로 빌드한 파일명을 구분해주기 위해 추가)

두 파일이 있는 폴더의 터미널을 열고 다음의 명령어를 통해 파일 통합
lipo -create SomeSDK.framework/SomeSDK SomeSDK-simul.framework/SomeSDK -output SomeSDK
-create (합칠 빌드파일 경로1) (합칠 빌드파일 경로2)
-output (새로운 바이너리 파일의 이름)
이때 만난 터미널 에러 : have the same architectures (arm64) and can't be in the same fat output file
두 파일이 같은 아키텍처를 가지고 있어 하나의 fat 파일로 만들어내지 못한다는 오류였다.
fat file : 두 개의 아키텍처 빌드를 가지고 있는 파일
thin file : 하나의 아키텍처 빌드를 가지고 있는 파일
아이폰 실기기의 아키텍처는 arm64로 하나지만 시뮬레이터의 아키텍처는 arm64, x86_64 두개를 갖고 있다고 언급했다. 아래의 커멘드를 통해 확인해보자.
lipo -info SomeSDK-simul.framework/SomeSDK

커맨드 실행 결과, 두개의 아키텍처 빌드를 가진 fat파일이였다. 따라서 이 게시물을 참고해 arm64 아키텍처를 제거한 후 다시 시도하여 해결하였다.
lipo -remove arm64 SomeSDK-simul.framework/SomeSDK -output SomeSDK-simul.framework/SomeSDK
-remove (제거할 아키텍처 명) (제거할 아키텍처 빌드파일 경로)
-output (제거되서 새롭게 만들어질 아키텍처 빌드파일 명)
SomeSDK-simul.framework/Modules에 있는 파일도 SomeSDK.framework/Modules 경로의 파일에 병합
이렇게 시도함으로써 위에 에러는 발생하지 않음! 하지만...
Building for iOS Simulator, but linking in dylib built for iOS, file '빌드파일경로' for architecture arm64
Linker command failed with exit code 1 (use -v to see invocation)
다음과 같은 에러를 다시 만나게 되었다.
새로운 에러의 원인은, iOS 시뮬레이터를 돌리기 위해 프레임워크에 시뮬레이터용 arm64 아키텍처 빌드가 필요한데 그것이 존재하지 않기 때문이였다.
이전 과정에서 fat 파일을 만들기 위해 시뮬레이터 빌드파일의 arm64 아키텍처를 제거한 것이 원인으로 판단된다.
XCFramework로 만들게 되면 Fat Framework와 같이 여러 빌드 아키텍처를 가질 수 있다.
최종적으로, 기존의 SDK 프레임워크를 XCFramework로 새롭게 만들어 적용하니 실기기, 시뮬레이터에서 모두 빌드가 가능했다!
운영체제에서 공부한 컴파일/빌드 과정이 여기서 쓰일 줄이야... 이번 에러를 해결하면서 정말 도움이 많이됐다. iOS 공부뿐만 아니라 CS 공부도 굉장이 중요하다는 것을 다시 한 번 느꼈다.
[참고링크]
ARM 맥북에서 SDK 시뮬레이터 빌드 오류 : https://byeon.is/swift-m1-daum-map-sdk-framework-error/
Universal App : https://ios-development.tistory.com/805
lipo -create 에러해결 : https://stackoverflow.com/questions/64022291/ios-14-lipo-error-while-creating-library-for-both-device-and-simulator
lipo 명렁어 : https://zamcom.tistory.com/286
새로운 오류원인 및 해결방법 : https://medium.com/@jooyoungho/오류를-마주친-그대에게-building-for-ios-simulator-but-linking-in-object-file-built-for-ios-2d06e3742294
XCFramework : https://hururuek-chapchap.tistory.com/216