Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] "dyld: Library not loaded @rpath" 에러 해결 방법 (#framework, #import) 본문

iOS 응용 (swift)

[iOS - swift] "dyld: Library not loaded @rpath" 에러 해결 방법 (#framework, #import)

jake-kim 2023. 9. 30. 01:31

사전지식) dyld와 @rpath

  • dyld: dynamic linker (동적 프레임워크 링커)
  • @rpath: (run search path) 실행 중인 앱이 특정 라이브러리나 프레임워크를 찾을 때 동적 라이브러리 검색 경로를 나타내는 토큰

동적 프레임워크 링커란?)

  • dynamic framework의 주소와 파일들을 Heap과 Stack영역에 위치시키는 역할을 담당하는 매개체
  • 구체적인 dynamic framework 개념은 이전 포스팅 글 참고

https://ios-development.tistory.com/1004

"dyld: Library not loaded @rpath" 에러 메시지

  • 동적 프레임워크 링커가 @rapth를 로드하지 못한다는 의미
  • Xcode 설정 > Embed 옵션이 꺼져있는 상태에서 import한 경우에 발생

  • 해결방법: Embed & Sign으로 변경

  • rpath 경로 변경
    • Build Settings > "runpath search path" 검색하여 rpath를 맞게 변경

직접 확인해보기 - 동적 프레임워크 준비

  • 예제로 사용할 프레임워크 생성
    • Xcode > 파일 추가 > Framework

  • 생성 완료

  • 예제로 사용할 .swift파일 생성

import Foundation

open class JakeString {
    public var name = "jake"
    
    public init() {
    }
    
    @_spi(Private) public func myPrivateFunc() {}
}
  • 이 프레임워크를 사용할 App 프로젝트 생성

  • Target > General > Frameworks, Libraries, and Embedded Content 영역으로 아까 만든 프레임워크 .xcodeproj파일을 드래그 앤 드롭
    • 주의) 프레임워크 프로젝트를 반드시 닫고 드래그 앤 드롭

(드래그 앤 드롭 후 + 버튼을 눌러서 product 파일도 추가하면 프레임워크 추가 완료)

  • "dyld: Library not loaded @rpath" 오류를 재현하기 위해 rpath를 임의로 변경
    • "runpath search path" > 아래 @escutable_path/Frameowrks 를 임의의 값으로 변경

(변경 완료)

  • 클린 빌드 후 ViewController에서 아래와 같이 "import Jake"하고난 후 실행
import UIKit
import Jake

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let string = JakeString()
        print(string.name)
    }
}
  • 기대 결과대로 rpath를 찾지 못했다는 런타임 에러가 발생

(전체)

Warning: Error creating LLDB target at path '/Users/jake/Library/Developer/Xcode/DerivedData/MyApp-fvkmtrlkleqcngajhgururegogcy/Build/Products/Debug-iphonesimulator/MyApp.app'- using an empty LLDB target which can cause slow memory reads from remote devices.

dyld[67518]: Library not loaded: @rpath/Jake.framework/Jake

  Referenced from: <BCBADE96-BF3A-3224-870C-950A098BFDE2> /Users/jake/Library/Developer/CoreSimulator/Devices/3F643203-F34C-417E-A116-8F9991EC010B/data/Containers/Bundle/Application/EA92E790-C34B-4AB0-BE8C-91E8D5CBF93F/MyApp.app/MyApp

  Reason: tried: '/Users/jake/Library/Developer/Xcode/DerivedData/MyApp-fvkmtrlkleqcngajhgururegogcy/Build/Products/Debug-iphonesimulator/Jake.framework/Jake' (no such file), '/Library/Developer/CoreSimulator/Volumes/iOS_21A328/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 17.0.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Jake.framework/Jake' (no such file)

정리

  • "dyld: Library not loaded @rpath"은 import 할 때 dynamic framework를 링킹하는데, 이 때 dynamic framwork를 찾지 못할 때 발생
  • dynamic framework를 찾지 못하는 경우는 rpath (run search path)의 값이 잘못되어 있거나, embed설정을 하지 않은 경우 발생

* 전체 코드: https://github.com/JK0369/ExRpath.git

Comments