IT한 것/Mobile (iOS, AOS)

Xcode 12 iOS 시뮬레이터용으로 빌드시 실패하는 경우

lovian 2021. 3. 16. 16:05

Xcode 12, building for iOS Simulator, but linking in object file built for iOS, file for architecture arm64

 

아마 이미 많은 검색을 해봤을거라고 판단한다. 위와와 비슷한 문구를 만났을 것이고, 해결책도 많이 봤을 것이다.

보통 그런 해결책들 (VALID ARCH 관련 옵션처리)이 맞긴 하겠지만, 나 처럼 configure 를 이용하여 커맨드라인으로 직접 빌드하는 환경에는 전혀 도움되지 않았다. 때문에 대체 뭐가 바뀌었고, 무엇 때문에 안되는지 파악하기로 했다.

 

기존에는 -arch armv6 -arch armv7 -mios-version-min=6.0 -isysroot 등의 옵션을 사용하여 iOS Device 라이브러리를 만들었고, 시뮬레이터용은 -arch x86_64 -mios-version-min=6.0 -isysroot 등의 옵션으로 처리가 가능했다.
단순히 생각해보면 -arch x86_64 -arch arm64 -mios-version-min=6.0 -isysroot 식으로 단순히 -arch arm64만 추가하면 될 것 같았는데 계속 실패했다.

 

조금 미궁에 빠진 것 같아서, 신규 프로젝트를 만들어 xcodebuild 명령으로 빌드하고 명령 옵션을 비교 분석해봤다.

결정으로 큰 차이가 있었다 -arch옵션과 -mios-version-min 대신에 -target 이라는 옵션을 쓰고 있음을 확인했다. -target x86_64-apple-ios9.0-simulator - target arm64-apple-ios-9.0-simulator -sysroot 식으로 바꿔치기하면 될줄 알았는데, 또 실패했다.

 

하지만 iOS Device는 -target으로 바꾼 것으로 무사히 빌드가 성공했다.

 

결국 알아낸 해결 방법은 명령을 따로 실행해야한다.


그런데 -arch armv6 -arch arm64 등 arch 옵션을 이용하면 한번의 명령으로 FAT 바이너리가 잘 생성되었으나, 여러 target 옵션을 이용하면 하나의 바이너리(FAT 아님)가 생성되는 것을 확인 할 수 있었다

결국, 시뮬레이터와 디바이스 각각 나누어서 빌드하고 합치던 것이, x86_64 시뮬레이터, arm 시뮬레이터, 디바이스 로 세 개로 나누어 빌드하고 합치는 것으로 변경 되었다

특이했던 부분

  • -arch와 -mios-version-min를 -target으로 대체하는 결론을 내렸지만 -mios-version-min을 뺀 -arch 만 사용하면 arm 시뮬레이터용 빌드가 정상동작 하였다
  • tbd
    • 더이상 shared object는 dylib으로 제공되지 않고 tbd라는 텍스트 파일을 제공한다
    • 이 파일 내에 실제 dylib으로 연결해야할 symbol 이름과 주소가 있고 이것을 파싱하는 것 같다
    • 예전에는 빌드 문제 있을때 nm 명령을 이용하여 dylib을 분석하는 방법을 사용했는데 이제 tbd를 하나하나 열어봐야 할 듯 하다