안녕하세요 아이티 박사 호 입니다.
오늘은 xcode에서 Other Linker Flags에 대해서 알아보겟습니다.
외부 정적 라이브러리를 사용할때 설정을 한다고 하는데요
저는 개발 환경이 flutter dart로 firebase 라이브러리 사용시 오류가 발생하여
Other Linker Flags에 -ObjC 플래그 설정하여 문제를 해결해 봤습니다.
flutter ios개발이 쉽지 않네요
상세하게 정리된 내용은 아래와 같습니다.
Xcode에서 Other Linker Flags에 -ObjC 플래그를 설정하는 이유와 목적, 설명
- -ObjC 플래그의 목적: -ObjC 플래그는 정적 라이브러리에 포함된 모든 Objective-C 클래스와 카테고리를 로드하도록 링커에 지시합니다. 이는 특히 정적 라이브러리를 사용할 때 중요합니다.
- 주요 이유: a) 카테고리 로딩: Objective-C 카테고리가 정적 라이브러리에 정의되어 있을 때, 이 플래그가 없으면 해당 카테고리가 로드되지 않을 수 있습니다. b) 심볼 해결: 일부 Objective-C 심볼(예: 클래스, 메서드)이 링킹 과정에서 누락되는 것을 방지합니다.
- 작동 방식:
- 링커가 라이브러리를 스캔하여 Objective-C 클래스와 카테고리를 찾습니다.
- 발견된 모든 Objective-C 코드를 최종 바이너리에 포함시킵니다.
- 사용 시 주의사항:
- 바이너리 크기 증가: 사용하지 않는 코드도 포함될 수 있어 앱 크기가 커질 수 있습니다.
- 링크 시간 증가: 모든 심볼을 검사하므로 빌드 시간이 늘어날 수 있습니다.
- 대안 및 관련 플래그:
- -force_load: 특정 라이브러리의 모든 오브젝트 파일을 강제로 로드합니다.
- -all_load: 모든 라이브러리의 모든 오브젝트 파일을 로드합니다(더 극단적인 방법).
- 언제 사용해야 하나:
- 서드파티 정적 라이브러리 사용 시
- 라이브러리에 카테고리가 포함되어 있을 때
- 링커 오류나 런타임 오류(selector not recognized 등)가 발생할 때
- 설정 방법:
- Xcode에서 프로젝트 설정 > Build Settings > Linking > Other Linker Flags에 -ObjC 추가
- 문제 해결:
- 만약 -ObjC로 문제가 해결되지 않는다면, -all_load나 -force_load를 시도해볼 수 있습니다.
- 특정 라이브러리에만 적용하고 싶다면 -force_load와 해당 라이브러리 경로를 함께 사용합니다.
- 성능 고려사항:
- 앱 시작 시간이 약간 늘어날 수 있습니다 (더 많은 코드를 로드하기 때문).
- 메모리 사용량이 증가할 수 있습니다.
- 최신 동향:
- Swift와 동적 라이브러리의 사용이 늘어나면서 -ObjC 플래그의 필요성이 점차 줄어들고 있습니다.
- 그러나 여전히 많은 Objective-C 기반 라이브러리와의 호환성을 위해 중요합니다.
이 플래그는 Objective-C 런타임의 동적 특성과 정적 링킹 사이의 간극을 메우는 중요한 역할을 합니다. 특히 서드파티 라이브러리를 사용할 때 발생할 수 있는 여러 문제를 예방하는 데 도움이 됩니다.
0 Comments