Symbol(s) not found for architecture x86_64, arm64 등 에러의 원인

  기존 회사 프로젝트가 테스트 기기에서는 잘 동작하는데 시뮬레이터에서는 동작하지 않는 문제가 있었습니다. 그래도 각자 테스트 기기가 있으니까 딱히 해결하려고 하지 않았습니다. 배포하는데 문제 없으니까요.. 그런데 이번에 iPhoneX가 나오면서 프레임이 완전히 바껴버렸어요. 이번에야 말로 시뮬레이터에서 돌아가지 않는 문제를 해결해야할 때가 온 거예요. 누군가도 이러한 문제를 겪고 있을 것 같아 포스팅 합니다.

프로젝트를 하다 보면 프레임워크, 라이브러리를 따로 빌드해서 넣을 때가 있습니다. 근데 에러가 납니다!

    • 프로젝트에 딱 복사 붙여넣기 하고 빌드 했는데 에러가 난다. 
    • 또는 테스트 기기에선 잘 돌아갔는데 Archiving을 하니까 에러가 난다, 
    • 또는 테스트 기기는 다 잘되는데 시뮬레이터에서 안 돌아간다.

    등등 ...

대략 이런 에러를 냅니다. 여기서 중요하게 봐야할 것은 "Symbol(s) not found for architecture x86_64' 라는 문구입니다. 해석해보면 SDWebImage, Zbar 등 라이브러리에 x86_64 아키텍쳐를 위한 심볼이 없다. 라는 것입니다. Xcode로 빌드할 때 어떤 Architecture를 타겟으로 빌드할지 설정합니다. 그 항목은 프로젝트 파일의 build Setting을 보면 알 수 있습니다. 


이미 빌드되어 있는 라이브러리가 어떤 아키텍쳐를 지원하고 있는지 확인하는 방법은 lipo -info 또는 file 명령어를 이용하면 됩니다.

lipo -info SDWebImage 

Architectures in the fat file: SDWebImage are: arm_v7 arm64 


기기 별로 지원하는 Architecture가 다릅니다. 간단하게 보면 아래와 같습니다.


Architecture 별 지원 기기

 ARMv7s 

 iPhone5, iPad4, iPhone5c 

 ARM64

 iPhone5s, iPad min2 . iPhone6, iPhoneX

 i386, x86_64

 맥용 (시뮬레이터) 


  위의 SDWebImage, Zbar라이브러리는  ARMv7, ARM64 아키텍쳐를 지원하도록 빌드되었습니다. 그렇다면 빌드할 때 x86_64로 빌드해서 넣어보기로 합니다. x86_64 아키텍쳐는 맥에서 사용하는 아키텍쳐입니다. 그렇다면 맥에서 돌아가는 시뮬레이터가 x86_64 아키텍쳐겠죠. 빌드할 때 타겟을 시뮬레이터로 설정하고 빌드하면 i386, x86_64를 지원하는 아키텍쳐로 빌드할 수 있습니다.

  프로젝트에 적용하고 빌드하면 시뮬레이터에서는 잘 돌아가는데 기기에서 빌드가 안되는 문제가 생깁니다. 'Symbol(s) not found for architecture arm64' 이런 에러를 냅니다. 어째튼 둘다 돌아가게 만들고 싶습니다. 그렇다면 ARMv7s, ARM64, x86_64 모두 지원하도록 빌드하면 됩니다. 다음 포스팅에 Fat Framework/Library를 빌드하는 방법을 소개하겠습니다.


'개발 > iOS' 카테고리의 다른 글

UIScrollView에서 Autolayout 적용하기  (1) 2017.11.21
Fat Framework 만들기  (0) 2017.11.17
Symbol(s) not found for architecture x86_64 에러  (0) 2017.11.15

+ Recent posts