Fat Framework 만들기

이번에는 저번 포스팅에 이어서 Fat Framework를 만드는 법을 소개하겠습니다. 프레임워크가 시뮬레이터, 실물 기기에서 모두 동작하기 위해서 x86_64, i386, ARM64, ARMv7 등의 아키텍쳐를 모두 지원하는 프레임워크를 만들어야 합니다. 앱스토어에 배포하기 위해서는 시뮬레이터 아키텍쳐를 반드시 지원하지 않아도 되지만 테스트할 때 다양한 기기를 보유하지 않다면 불편한 점이 많습니다.


Fat Framework로 만들 예제 프레임워크로 SDWebImage 프레임워크를 사용하겠습니다. 일단 기본적으로 Fat Framework는 lipo 명령어로 만들 수 있습니다.

각각의 아키텍쳐로 빌드 후 lipo 명령어를 이용하여 하나의 Fat Framework 를 생성하면 됩니다. 따로 빌드하고 명령어 치는게 귀찮다면 아래와 같이 타겟을 하나 더 추가하여 스크립트를 작성하여 빌드하면 됩니다.


Aggregate Target 추가

먼저 Xcode로 해당 프로젝트를 열어줍니다. Fat Framework를 만들기 위해서 새로운 타겟을 만듭니다. 프로젝트 파일을 선택하고 왼쪽 하단에 + 버튼을 눌러서 Target 추가를 해줍니다.


Cross-platform 탭으로 가면 Other 메뉴에 Aggregate가 있습니다. 선택하고 Next를 눌러주세요. 타겟이름은 UniversalFramework로 했습니다.


왼쪽 상단에 + 버튼을 누르면 Script를 추가할 수 있는 버튼이 있습니다. New Run Script Phase를 선택해줍니다.


그리고 스크립트 창에 아래의 스크립트를 복사하여 붙여넣기 해줍니다.

여기서 SCHEME_NAME은 빌드하고자 하는 프레임워크 타겟의 이름입니다. SDWebImage iOS는 중간에 띄어쓰기가 들어가서 자꾸 에러를 뱉어내서 해당 타겟을 복사하여 이름만 SDWebImage로 변경하였습니다. 빌드하고자 하는 타겟의 이름을 적어주면 됩니다.

출처 : https://medium.com/@syshen/create-an-ios-universal-framework-148eb130a46c


빌드할 수 있도록 새로운 scheme을 추가해줍니다. 왼쪽 상단 Stop 버튼 오른쪽 프로젝트 이름을 선택하고 Manage schemes ... 를 눌러줍니다.

+ 버튼을 누르면 방금 추가한 타켓이 입력되어 있습니다. 그냥 OK눌러줍니다.


shared 체크박스를 체크해주고 닫아줍니다.


이제 새로운 타겟이 성공적으로 추가되었습니다.


Fat framework 빌드하기

혹시 i386, x86_64를 시뮬레이터를 모두 지원하기 위해서는 빌드하기 전에 한가지 더 세팅합니다. 기본 Build configuration이 debug로 세팅되어 있는데 release로 세팅해줍니다.

아까 scheme추가 한 곳 메뉴 상단에 Edit Scheme..을 눌러줍니다.


Build Configuration이 Debug로 세팅되어 있는데 Release로 변경해주고 빌드해줍니다.


Fat Framework로 빌드된 프레임워크를 확인합니다. 오른쪽 클릭 후 Show in finder를 하면 해당 경로로 이동할 수 있습니다.


file 명령어로 확인해보니 i386, x86_64, armv7, arm64를 지원하는 프레임워크가 생성되었습니다.




'개발 > 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

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