2010-01-19 39 views
13

Tôi đang tạo một ứng dụng plugin (dylib) phụ thuộc vào một số thư viện khác. Các thư viện khác được cài đặt trên hệ thống của tôi, nhưng không được bảo đảm được cài đặt trên hệ thống của bất kỳ người dùng nào. Vì vậy, tôi cần phải tìm một cách bó các phụ thuộc cùng với ứng dụng của tôi.MacOSX: Cách thu thập phụ thuộc vào gói địa phương?

Tôi thấy rằng tôi có thể sử dụng otool để liệt kê hoặc thay đổi đường dẫn đến các dylib khác. Điều này sẽ cho phép tạo một thư mục bao gồm ứng dụng plugin của tôi và tất cả các phụ thuộc cần thiết.

Tuy nhiên, thực hiện việc này theo cách thủ công có vẻ như một công việc tốn thời gian và câm. Có các tiện ích sẵn có để tự động hóa nó không?

Hoặc có lẽ tôi đang làm sai và có cách tiếp cận tốt hơn và rõ ràng hơn cho vấn đề này?

Chỉnh sửa Tôi đã tạo một script tự động hóa hầu hết tác vụ.

Trả lời

14

Sử dụng đường dẫn tương đối trong dylib của bạn bằng cách sử dụng install_name_tool. Bằng cách đó, bạn có thể đặt chúng một lần và cài đặt thư mục đó ở bất kỳ nơi nào mà không cần phải sửa đổi thư viện của bạn tại thời điểm cài đặt.

Bạn nên đặt tất cả các phụ thuộc dylib của bạn vào một thư mục, sau đó sử dụng install_name_tool để đặt vị trí tương đối của các dylib khác mà bạn phụ thuộc vào. Giả sử libmyfoo.dylib thư viện của bạn phụ thuộc vào libbar.dylib:

install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib 

Bằng cách này, thư viện của bạn sẽ luôn luôn tìm kiếm libbar.dylib trong cùng thư mục nơi libmyfoo.dylib nằm.

Bạn cũng có thể cần phải chạy install_name_tool trên một số dylib khác, nếu chúng phụ thuộc lẫn nhau.

Hãy coi chừng, tài liệu dành cho install_name_tool chỉ ra rằng "Để công cụ này hoạt động khi tên cài đặt hoặc rpath lớn hơn, thì nhị phân phải được tạo bằng tùy chọn ld (1) -headerpad_max_install_names", vì vậy hãy chắc chắn bao gồm -headerpad_max_install_names tùy chọn dòng lệnh khi xây dựng thư viện của bạn.

@loader_path liên quan đến hệ nhị phân được sử dụng để tải dylib, trong trường hợp này là libmyfoo.dylib của bạn. Sử dụng @executable_path nếu bạn muốn tìm các thư viện liên quan đến tệp thực thi đã bắt đầu trình tự tải thư viện.

+0

Lưu ý rằng đây là câu trả lời tiền thưởng được chấp nhận tự động. Có lẽ nó đã không thực sự giải quyết vấn đề của người hỏi. –

3

Macdylibbundler là một công cụ nhỏ tiện dụng mà thực hiện chính xác những gì đang yêu cầu. Nó chắc chắn đã cứu mạng tôi khi phân phối các tệp nhị phân cho OSX.

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