안녕하세요 아이티 박사 호 입니다. 

오늘은 xcode에서  Other Linker Flags에 대해서 알아보겟습니다.

외부 정적 라이브러리를 사용할때 설정을 한다고 하는데요

저는 개발 환경이 flutter dart로 firebase 라이브러리 사용시 오류가 발생하여  

Other Linker Flags에 -ObjC 플래그  설정하여 문제를 해결해 봤습니다.

flutter ios개발이 쉽지 않네요

상세하게 정리된 내용은 아래와 같습니다. 



 Xcode에서 Other Linker Flags-ObjC 플래그를 설정하는 이유와 목적, 설명

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

플래그는 Objective-C 런타임의 동적 특성과 정적 링킹 사이의 간극을 메우는 중요한 역할을 합니다. 특히 서드파티 라이브러리를 사용할 발생할 있는 여러 문제를 예방하는 도움이 됩니다.