하루를살자

'ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64' 에러 본문

Xcode

'ld: building for iOS Simulator, but linking in dylib built for iOS, file for architecture arm64' 에러

Kai1996 2022. 8. 21. 16:44
배경

Xcode version : 13.3

Simualtor iOS version: 15.2

Mac CPU: M1

 

지도를 사용하는 새로운 프로젝트를 시작하려고 네이버 지도 패키지를 pod으로 설치한 뒤 여기에 나온 과정대로 세팅하는 중에 제목과 같은 architecture arm64 에러가 발생했다. 

 

에러 분석 및 해결

❗️주의 : 내용 중 틀린 내용이 있을 수 있습니다. 잘못된 정보가 있다면 바로 댓글 달아주세요.. 

//Error
ld: building for iOS Simulator, but linking in dylib built for iOS, file '../test/Pods/NMapsMap/framework/NMapsMap.framework/NMapsMap' for architecture arm64

많은 레퍼런스를 찾아봤는데 시원하게 문제를 해결해주는 글을 찾아보지 못했지만 에러 원인을 나름대로 분석하고 해결해봤다.

일단 M1 Silicon 의 프로세서 아키텍처는 arm 64를 기반으로 한다. Xcode 12 버전 이후로 Intel 칩을 사용하던 Mac과 Apple Silicon (M1)에서 실행되는 시뮬레이터를 실행시키기 위해서 arm64, x86_64 두 개의 아키텍처를 지원한다. (아래 디렉터리를 가면 Simualtor SDK 세팅을 확인할 수 있었다)

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/SDKSettings.json

Xcode 13 시뮬레이터 SDKSettings.json

 

ARM 기반 아키텍처를 지원함에 따라 아이폰 시뮬레이터에 ARM용 아키텍쳐가 arm64 가 추가되어 발생한 에러로 보인다. 그런데 여태 까지 Alamofire, SwiftLint 등 다른 라이브러리를 사용했을 땐 이런 에러가 발생하지 않았는데 왜 네이버 지도 API 만 사용하면 이런 에러가 발생하는지 이유를 모르겠다.  이글에서 찾아본 결과 각 프레임워크가 호환하는 아키텍처가 따로 정해져 있다고 한다. 그럼 네이버Map 은 arm64 기반 아키텍처 지원을 하지 않아서 그런 게 아닐까?라는 생각으로 프레임워크의 지원 아키텍처를 조회할 수 있는 명령어 "lipo -info"를 사용해봤다. 

 

lipo -info NMapsMap.framework/NMapsMap

하지만 결과는 x86_64, arm64 뿐만 아니라 i386, armv7 까지 지원한다...

> 왜 arm64 에러가 왜 나는 건데?? ㅜㅜ 왜 arm64 기반 시뮬레이터를 실행하면 런타임에서 에러가 발생하는데??? 

- 찾아보니 지금 저 리스트에 나와있는 arm 기반 바이너리 파일들은 iphone에 적용되는 정보라고 합니다. 

- 에러는 해당 프레임워크가 시뮬레이터를 실행시킬 때 필요한 arm 바이너리 파일 정보가 없기 때문에 발생하고 있는 것이었고요. 

- 그래서 실제 기기로 실행시켰을 때는 arm64 에러가 발생하지 않았던 것!

 

> 그럼 x86 기반으로 시뮬레이터를 실행시키면 되는 거잖아? 

- 지금부터 설명드릴 해결방법은 임시방편으로, 시뮬레이터를 arm64 기반으로 실행시키지 말고 x86 기반으로 실행시키는 방법입니다. (Rosetta를 사용해서 가능)

- 가장 좋은 해결방법은 framework를 지원해주는 곳에서 xcFramework에 arm64 for simulator를 지원해주어 M1 네이티브로 시뮬레이터를 구동하는 것입니다!. 

 

1. Project > BuildingSetting > All, Combined를 체크해주어 Excluded Architecture > 현재 사용하고 있는 scheme에 Any iOS Simulator SDK > arm64를 설정해줍니다.

arm64 Architecture 를 제외 시킴 (Debug 용)

 

2. 이렇게 설정해주고 clean and build를 해주면 "Framework not found"라는 에러가 발생하는데, 이유는 아직 추측에 불과하지만 Pod을 설치할때 의 빌드 환경과 xcode 의 현재 빌드환경이 바뀌어서 발생한것으로 생각 됩니다. 이를 해결하기 위해선 pod project 를 설치할때 아래와 같이 xcode project 와 같은 빌드 로 세팅 해줘야 합니다. 

Framework not found 

 

  • 현재 설치된 Pod 을 제거해준다. 
pod deintegrate
  •  Podfile에서 arm64를 제외하는 코드를 적용해준다
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'test' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

    post_install do |installer|
        installer.pods_project.targets.each do |target|
              target.build_configurations.each do |config|
                    config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
              end
    end
    end

    pod 'NMapsMap', '3.10.0'
    pod 'Alamofire'


end
  • 다시 Pod을 설치해준다. 
pod install

 

 

이렇게 해서 현재 x86 기반으로 시뮬레이터를 구동시킬 수 있었습니다.

 

*ps

- 현재 사용하는 네이버 맵 지도 버전이 3.10.0인데 가장 최신 버전 3.15.0 은 xcFramework에 시뮬레이터를 위한 arm64 바이너리 파일을 포함하고 있어 지금과 같은 과정을 하지 않아도 됩니다.

 

- CocoaPods에서 지원해주는 GoolgeMap 패키지도 M1 호환하지 않는다고 합니다. 임시방편으로 위와 같은 방법으로 프로젝트를 진행하시거나, M1 네이티브로 시뮬레이터를 실행시키시려면 따로 Carthage를 사용해서 xcFramework 가 포함된 버전을 이용해야 한다고 하네요. 


  • 참조 

https://susuthapa19961227.medium.com/apple-silicon-and-the-library-incompatibility-problem-for-ios-d evelopment-8c2d875283f2

 

Apple Silicon and the library incompatibility problem for iOS development

You work your ass off day and night to save money so that you can get a shiny new Macbook with M1 processor. You get your Macbook, you do…

susuthapa19961227.medium.com

https://subicura.com/mac/dev/apple-silicon.html#apple-silicon-m1

 

패키지 관리자 (Apple Silicon/M1)

패키지 관리자 설정 방법을 알아봅니다.

subicura.com

 

https://jusung.github.io/Xcode12-Build-Error/

 

[Xcode] Xcode12에서 시뮬레이터 빌드 오류 원인 및 해결방법

이번 포스트에서는 Xcode12에서 시뮬레이터에 빌드시 오류가 발생하는 원인과 해결방법에 대해 알아 보겠습니다. 포스트가 제법 깁니다. 😅

jusung.github.io

https://velog.io/@sainkr/TIL-2021.02.18

 

[TIL] 2021.02.18

Excluded Architectures에 Any iOS Simulator SDK를 추가 후 arm 64를 넣어준다.Swift에서 사용 시 위 가이드를 다 따라하고 난 후프로젝트명-Bridgin-Header.h 파일 생성Objective-C Bridgin Header에

velog.io

https://github.com/realm/realm-swift/issues/6685

 

Can't run project with RealmSwift in iOS simulator after building with Xcode 12 (after beta 3) · Issue #6685 · realm/realm-swi

Goals My goal is to run the app in simulator (preferably iOS 14 one) to be prepared for future iOS and Xcode updates. Something's seem broken in the mapping of arm64 to x86_64 when new build sy...

github.com

https://blog.nachal.com/1736

 

M1 맥북 XCode 빌드오류, architecture arm64, CocoaPod GoogleMap, AdMob

M1 맥북에서 코코아팟을 이용하면 빌드오류가 날 수 있습니다. 저는 구글지도를 붙이다가 에러가 났습니다. Podfile에 arm64를 제외하는 코드를 넣으면 해결됩니다. ld: building for iOS Simulator, but linking

blog.nachal.com

https://darth-vader.tistory.com/11?category=839750 

 

[Xcode] M1 'cyclone' is not a recognized processor for this target 해결법

회사 프로젝트를 CocoaPods 와 SPM 을 사용하는 환경에서 Tuist + Dependencies 를 사용하는 환경으로 이주를 했습니다. 이주를 하며 많은 이슈가 발생했었는데, 그 중에 하나 해결하기 어려웠던 이슈가

darth-vader.tistory.com

 

https://charlie-dev.tistory.com/13

 

[Swift] Xcode arm64 빌드 에러 삽질 of 삽질

회사에서 프로젝트 소스코드를 받아 분석을 하려하는데 빌드 하려니 계속 building for iOS Simulator, but linking in object file built for iOS, for architecture arm64 에러를 뿜어 내는 것이었다. 진짜 갑..

charlie-dev.tistory.com

https://blog.sapjilbang.com/86

 

xCode Framework Architecture 제거

금융 앱에는 수많은 보안 라이브러리가 들어가는데 어떤 것은 시뮬레이터(i386, x86/64)를 지원하고 어떤 것은 지원하지 않는다 보통 이런 라이브러리가 혼재되어 있는 경우에는 어차피 시뮬레이

blog.sapjilbang.com

https://zamcom.tistory.com/286

 

lipo 명령

출처 : https://ss64.com/osx/lipo.html 결과출처 : 직접 실행 스테틱 라이브러리에 다양한 빌드 아키텍쳐를 넣기 위해서는 lipo 명령을 이용한다. 아이폰 디바이스에는 arm계열이, Mac에서 시뮬레이터를 돌

zamcom.tistory.com

 

'Xcode' 카테고리의 다른 글

Xcode 디바이스 연결시 에러  (0) 2022.08.21
Comments