2012-02-13 26 views
31

Tôi đang phát triển Ứng dụng Ca cao sử dụng phiên bản mới nhất của Xcode 4, tôi muốn liên kết các thư viện động với dự án của tôi (dylibs).Tại sao install_name_tool và otool cần thiết cho các thư viện Mach-O trong Mac OS X?

Tôi đọc ở đâu đó rằng việc thêm thư viện trong dự án của tôi là không đủ vì tôi phải chạy install_name_toolotool để làm cho dự án của tôi sử dụng thư viện đã được nhóm trong dự án của tôi.

Tôi đã đọc các trang hướng dẫn sử dụng cho install_name_tool, nhưng tôi không hiểu TẠI SAO tôi phải làm điều này.

Thư viện hoạt động như thế nào? Đặc biệt quan tâm ở phần nơi ứng dụng và các thư viện có đường dẫn trỏ đến địa điểm cụ thể trong máy tính của tôi, giống như /usr/local/lib/mylibrary.dylib khi chạy otool -L

Trả lời

51

Apple có nhiều cách định vị các thư viện chia sẻ:

  1. @executable_path: liên quan đến thực thi chính
  2. @loader_path: liên quan đến nhị phân giới thiệu
  3. @rpath: tương ứng với bất kỳ danh sách đường dẫn nào.

@rpath là phần bổ sung mới nhất, được giới thiệu trong OS X 10.5.

Nếu ví dụ bạn muốn có thực thi của bạn trong Contents/MacOS và các thư viện trong Contents/Libraries bạn có thể làm như sau:

install_name_tool -id @rpath/Libraries/lib_this.dylib builddir/lib_this.dylib 

và trong top cấp thực thi thiết lập rpath với:

install_name_tool -add_rpath @loader_path/.. myexecutable 

và:

install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable 

N ote: rằng đường dẫn đầu tiên sau -change phải khớp chính xác với những gì hiện đang ở dạng nhị phân.

Nếu bạn bị mất otool -l -v myexecutable sẽ cho bạn biết những lệnh tải chính xác nào hiện có trong tệp thực thi.

Xem man dyldman install_name_tool để biết thêm thông tin.

+0

'otool -L' cũng hữu ích khi hiển thị tên và thư viện được chia sẻ (mà bạn có thể muốn thay đổi bằng' install_name_tool'. – par

+6

Lưu ý: install_name_tool không thành công; luôn kiểm tra kỹ xem nó có thực sự làm những gì bạn đã nói không (sử dụng 'otool -L '. – geowar

+0

Dường như các thuộc tính trong một dylib không thực sự quan trọng. Chúng chỉ được sử dụng khi liên kết một tệp thực thi với dylib để sao chép các thuộc tính từ dylib đến tệp thực thi. trường hợp khi bạn đã có một tệp thực thi được liên kết với dylib nhưng bạn cần phải thay đổi đường dẫn, thì chỉ cần chỉnh sửa tệp thực thi để đặt LC_LOAD_DYLIB và tùy chọn, LC_RPATH. Trường hợp thứ hai chỉ cần thiết nếu tệp đầu tiên có @rpath trong nó. –