Đó là một lỗi thời gian chạy được gây ra bởi Dynamic Linker
dyld: Library not loaded: @rpath/...
...
Reason: image not found
Các lỗi Library not loaded
với @rpath
chỉ ra rằng Dynamic Linker
không thể tìm thấy nhị phân.
Kiểm tra xem khung động đã được thêm vào General -> Embedded Binaries
Kiểm tra @rpath
thiết lập giữa người tiêu dùng (ứng dụng) và nhà sản xuất (khung động):
- Khung động:
Build Settings -> Dynamic Library Install Name
- Ứng dụng:
Build Settings -> Runpath Search Paths
Build Phases -> Embed Frameworks -> Destination, Subpath
Liên kết động
Dynamic Library Install Name(LD_DYLIB_INSTALL_NAME)
được sử dụng bởi loadable bundle
( Dynamic framework
như một công cụ phái sinh) khi dyld
phát hành
Dynamic Library Install Name
- đường dẫn đến tệp nhị phân (không phải .framework). Vâng, họ có cùng tên, nhưng MyFramework.framework
là một packaged bundle
với MyFramework
tập tin nhị phân và các nguồn lực bên trong.
Con đường này vào thư mục có thể tuyệt đối hay tương đối (ví dụ như @executable_path
, @loader_path
, @rpath
). Đường dẫn tương đối được ưa thích hơn vì nó được thay đổi cùng với một neo rất hữu ích khi bạn phân phối gói của mình dưới dạng một thư mục duy nhất
đường dẫn tuyệt đối - ví dụ Framework1
//Framework1 Dynamic Library Install Name
/some_path/Framework1.framework/subfolder1
@executable_path
@executable_path - liên quan đến nhị phân mục nhập -
Trường hợp sử dụng ví dụ Framework2
: nhúng a Dynamic framework
vào một ứng dụng
//Application bundle(`.app` package) absolute path
/some_path/Application.аpp
//Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
//Framework2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework2 Dynamic Library Install Name
@executable_path/../Frameworks/Framework2.framework/subfolder1
//Framework2 binary resolved absolute path by dyld
/some_path/Application.аpp/subfolder1/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
@loader_path
@loader_path - liên quan đến gói là chủ sở hữu của
trường hợp sử dụng nhị phân này: khung có khung nhúng - Framework3_1 với Framework3_2 bên trong
//Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1
//Framework3_2 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
//Framework3_1 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework3_1 @loader_path == Framework3_1 @executable_path
/some_path/Application.аpp/subfolder1
//Framework3_2 @executable_path == Application binary absolute path
/some_path/Application.аpp/subfolder1
//Framework3_2 @loader_path == Framework3_1 binary absolute path
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1
//Framework3_2 Dynamic Library Install Name
@loader_path/../Frameworks/Framework3_2.framework/subfolder1
//Framework3_2 binary resolved absolute path by dyld
/some_path/Application.аpp/Frameworks/Framework3_1.framework/subfolder1/../Frameworks/Framework3_2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework3_1.framework/Frameworks/Framework3_2.framework/subfolder1
@rpath - Đường dẫn tìm kiếm Runpath
Ví dụ khung2
Trước đây chúng tôi phải thiết lập một Framework để làm việc với dyld. Nó không thuận tiện vì không thể sử dụng cùng một Framework với các cấu hình khác nhau
@rpath
là một khái niệm ghép dựa trên các phần bên ngoài (Ứng dụng) và lồng nhau (Khung động):
//Application Runpath Search Paths
@executable_path/../Frameworks
//Framework2 Dynamic Library Install Name
@rpath/Framework2.framework/subfolder1
//Framework2 binary resolved absolute path by dyld
//Framework2 @rpath is replaced by each element of Application Runpath Search Paths
@executable_path/../Frameworks/Framework2.framework/subfolder1
/some_path/Application.аpp/Frameworks/Framework2.framework/subfolder1
*../
- đi đến phần gốc của thư mục hiện tại
otool
- công cụ hiển thị tập tin đối tượng
//-L print shared libraries used
//Application otool -L
@rpath/Framework2.framework/subfolder1/Framework2
//Framework2 otool -L
@rpath/Framework2.framework/subfolder1/Framework2
//-l print the load commands
//Application otool -l
LC_LOAD_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2
LC_RPATH
@executable_path/../Frameworks
//Framework2 otool -l
LC_ID_DYLIB
@rpath/Framework2.framework/subfolder1/Framework2
install_name_tool
thay đổi tên cài đặt thư viện chia sẻ động bằng cách sử dụng -rpath
CocoaPods
sử dụng use_frameworks!
[Giới thiệu] để điều chỉnh mộtDynamic Linker
[Từ vựng]
Link Binary with Libraries
và bằng cách nào đó Xcode biết sao chép chúng vào gói ứng dụng của bạn, trong khi đối với các khung tùy chỉnh thì điều này đơn giản là không xảy ra.