2012-10-23 27 views
9

Tôi có một ứng dụng, gọi nó là Animal.app. Bên trong thư mục Contents/Frameworks của nó là một khuôn khổ, nói Mammal.framework. Và bên trong thư mục Versions/A/Frameworks của khung, tôi có dog.dylib. Tên cài đặt của dog.dylib là @ rpath/dog.dylib. Đối với cài đặt "Runpath Search Paths" của khung, tôi đã chỉ định @loader_path/../Frameworks. (Lập luận của tôi cho rằng thiết lập cuối cùng là "nạp" của dylib sẽ là nhị phân của khuôn khổ này, tại đường dẫn Mammal.framework/Versions/A/Mammal.)@rpath cho thư viện động được nhúng trong một khung

tôi nhận được một thông báo lỗi khi chạy:

Dyld Error Message: 
    Library not loaded: @rpath/dog.dylib 
    Referenced from: /Volumes/VOLUME/*/Animal.app/Contents/MacOS/../Frameworks/Mammal.framework/Versions/A/Mammal 
    Reason: image not found 

tôi đã đọc tài liệu "Thư viện phụ thuộc Run-Path" của Apple và bài đăng trên blog của Mike Ash trên @rpath, nhưng tôi vẫn không thể nhìn thấy những gì tôi đang làm sai.

Trả lời

6

Nó chỉ ra rằng đường dẫn tìm kiếm đường chạy bên phải là @loader_path/Frameworks. Những gì tôi đã mất là @ loader_path đại diện, không phải là đường dẫn đầy đủ đến bộ tải, nhưng con đường đó trừ đi thành phần cuối cùng của nó. Mike Ash's blog post không nói điều đó, nhưng tôi bằng cách nào đó đã bỏ lỡ nó. Vì vậy, trong trường hợp của một khung công tác, @loader_path kết thúc bằng A.

+0

Có, phải rõ ràng: Thư mục Cài đặt cho cả dylib lồng nhau và khung mẹ của nó phải là "@rpath". Khung công tác mẹ sau đó bao gồm "@ loader_path/Frameworks" trong Đường dẫn tìm kiếm Runpath của nó (vì dylib kết thúc với tư cách là anh chị em của thư mục Khung); ứng dụng sử dụng khung này bao gồm "@loader_path /../ Frameworks" (vì tệp thực thi nằm trong MacOS). Ứng dụng cũng có thể sử dụng '@ executable_path', nhưng' @ loader_path' có vẻ lạnh hơn :-) – natevw

+1

Tôi không hiểu bạn thực sự đã làm gì để làm cho nó hoạt động ... giải thích cho tôi như tôi là 6. –

+2

@ Prof.Falken: Trong cài đặt xây dựng cho khung, trong Liên kết, có một cài đặt được gọi là "Đường dẫn tìm kiếm đường chạy". Tôi đặt giá trị của nó thành '@ loader_path/Frameworks'. – JWWalker

Các vấn đề liên quan