Sure, Why not?

Runtime linking failure 본문

💻

Runtime linking failure

joho2022 2024. 10. 8. 15:36

 

 

들어가기 앞서

기존에 모듈을 나눠서 관리할 때, 라이브러리나 프레임워크를 사용하게 됩니다.

초기에 저는 둘의 차이점을 깊게 이해하지 못하고 무지성으로 라이브러리로 선택하여 모듈을 나눴는데요.

 

UIKit으로 빌드해서 UI를 확인하는 것이 귀찮아서 SwiftUI미리보기 기능을 ViewController에 확장하여 미리보기를 할려고 하였는데,

Runtime linking failure 에러가 발생하였습니다.

 

SwiftUI 미리보기 기능을 사용하면서 왜 staticLibrary로 설정된 모듈에서 미리보기가 제대로 작동하지 않는지 그 이유와

라이브러리와 프레임워크 그리고 정적 동적에 대해 학습해보겠습니다.

 

 

🤔 Library? Framework?

🙋‍♂️

둘다 공통점은 코드의 재사용성을 높이기 위한 구조입니다.

그러나 포함하는 요소와 사용 방식에 차이가 있습니다.

 

  • Library

특정 기능을 수행하는 코드 집합입니다.

UI 구성요소나 파일 리소스는 포함하지 않고, 코드만 제공합니다.

 

  • Framework

코드와 함께 리소스까지 포함된 패키지입니다.

애플리케이션의 전체적인 구조와 흐름을 제어합니다.

 

 

🤔 Static vs Dynamic

🙋‍♂️

Static

  • static Library

코드가 앱 빌드 시점에 통합되어서, 앱이 실행될 때 로드할 필요가 없게 됩니다.

다시 말해서, 컴파일 시점에 코드를 앱의 실행 파일에 포함시킵니다.

런타임 때 오버헤드가 없기 때문에 빠른 실행은 가능하지만,

실행 파일의 크기가 커질 수 있습니다.

 

 

컴파일: 코드를 기계어로 번역하는 과정

런타임: 번역된 코드가 실제로 실행되는 시간

 

  • static Framework

정적 라이브러리와 비슷하지만, 리소스파일도 포함됩니다.

 

Dynamic

  • dynamic Library

앱이 실행될 때, 필요한 라이브러리가 런타임 때 메모리에 로드가 됩니다.

실행 파일의 크기를 줄일 수 있지만, 앱 실행중에 오버헤드가 발생할 수 있습니다.

  • dynamic Framework

동적 라이브러리와 유사하고, 리소스와 함께 코드가 로드되어서, 런타임 시점에 필요한 부분만 로드할 수 있습니다.

 

 

🤔 왜 SwiftUI 미리보기가 안 되었을까?

🙋‍♂️

저는 처음에 staticLibrary로 Presentatin 모듈을 나눠 설정하였습니다. 그리고 UIKit의 뷰 컨트롤러에서 SwiftUI 미리보기 기능을 사용하려 했으나, 정적 라이브러리 특성 때문에 에러가 발생하였습니다.

 

정적 라이브러리는 컴파일 시점에 앱에 포함되기 때문에,

SwiftUI 미리보기가 요구하는 런타임 비슷한 환경에서의 동적 로딩이 불가능합니다.

SwiftUI 미리보기는 런타임과 비슷한 환경에서에서 UI를 동적으로 렌더링합니다.

 

 

🤔 해결방법

🙋‍♂️

그래서 staticLibrary → dynamic framework로 변경하니, 해결이 되었습니다.

동적 프레임워크는 런타임에 로드되기 때문에 SwiftUI 미리보기에서 동작할 수 있었습니다.

 

 

정리

SwiftUI 미리보기를 제대로 활용하려면 dynamic framework코드와 리소스를 모두 포함하고 런타임에 동적으로 로드될 수 있어 SwiftUI 미리보기에 필요한 동적 환경리소스 로딩을 지원할 수 있음을 학습하였고,

 

라이브러리와 프레임워크 그리고 정적과 동적일 때 구분을 학습할 수 있었습니다. :)

'💻' 카테고리의 다른 글

Tuist 기존 프로젝트에 테스트 타겟 추가  (2) 2024.12.06
Xcode16.1) 소스트리 사용시 SPM 에러  (0) 2024.11.03
Tuist를 활용한 모듈화  (6) 2024.10.02
Dynamic Programming  (1) 2024.09.30
Firestore  (0) 2024.09.20