2012-02-01 31 views
6

(Có, tôi hiểu rằng toàn bộ điểm của dylib là nó tải động, nhưng tôi đang cố gắng tạo một gói tự chứa.)Tôi có thể bao gồm dylib-s trong tệp thực thi của mình không?

Tôi có một tệp thực thi mà tôi đã xây dựng từ dòng lệnh - - trên OS-X/Lion, nếu nó quan trọng. Tôi đã gửi tập tin thực thi cho một người bạn, nhưng anh ta không thể chạy nó vì anh ta không cài đặt các thư viện. Anh ta muốn không phải cài đặt các thư viện, vì vậy bây giờ tôi đang cố gắng tạo một gói bao gồm tệp thi hành gốc cộng với tất cả các thư viện cần thiết.

Tôi thường làm việc trong XCode (IDE) và không quen thuộc với các công cụ tạo và dòng lệnh và tùy chọn của chúng. (Tôi đã xây dựng công cụ này theo hướng dẫn rất tốt từ web.) Do đó, hướng dẫn rõ ràng sẽ hữu ích.

Cảm ơn!

+0

Bạn có thể chấp nhận câu trả lời của abarnert không? Điều đó sẽ giúp người khác tìm thấy nó. Nó rất hữu ích cho tôi. – Yitz

+0

Xong. Xin lỗi về sự chậm trễ. – Olie

Trả lời

10

Bạn không thể đặt trực tiếp dylib vào bên trong tệp thi hành. (Đó là khá nhiều những gì được phát minh cho - nhưng điều đó không giúp bạn với các công cụ dòng lệnh.)

Bạn có thể xây dựng lại mỗi thư mục như một thư viện tĩnh (.a). nhu cầu sẽ được sao chép vào tệp thực thi và bạn không cần phải phân phối bất kỳ thứ gì với nó. Nếu bạn đã có nguồn cho các thư viện, điều này thường rất dễ dàng - nhưng không biết chính xác cách bạn đang xây dựng mọi thứ, thật khó để cho bạn biết những gì cần thay đổi.

Một điều cần ghi nhớ với liên kết tĩnh là nó ảnh hưởng đến cách các giấy phép khác nhau phát cùng nhau. Đặc biệt, nếu bất kỳ thư viện nào bạn đang sử dụng được cấp phép LGPL, liên kết tĩnh chúng có những hậu quả mà liên kết động không. Xem this question (và các liên kết trên câu trả lời) để biết thêm chi tiết, nhưng thực sự, bạn không nên tin tưởng câu trả lời trên Stack Overflow để được tư vấn pháp lý về giấy phép. Dù sao, đó có lẽ không phải là một vấn đề cho OP của "Tôi muốn xây dựng một chương trình và đưa nó cho bạn của tôi", nhưng đối với những người khác đọc câu hỏi này sau, nó có thể được.

Nếu liên kết tĩnh là không thể hoặc mong muốn, tất cả những gì bạn cần làm là gói các tập tin thực thi và dylib lại với nhau và đưa chúng vào máy của bạn bè. Vì anh ta dường như không muốn chạy trình cài đặt, điều đó có nghĩa là tarball hoặc zipfile.

Phần khó khăn nhất là đảm bảo exe biết nơi để tìm các dylibs. Trừ khi mỗi dylib nằm trong đường dẫn tìm kiếm dyld (xem manpage cho dyld để biết thêm chi tiết, nhưng nó sẽ không giúp bạn nếu bạn không muốn cài đặt bất cứ thứ gì), hoặc ở cùng một nơi chính xác vào thời điểm bạn liên kết nó, chạy thực thi sẽ thất bại với một lỗi "hình ảnh không tìm thấy" từ dyld.

May mắn thay, "cùng một địa điểm" có thể có nghĩa là đường dẫn ma thuật như "@ executable_path/libfoo.dylib", có nghĩa là "trong cùng thư mục với myexe", chứ không phải đường dẫn tuyệt đối như "/ opt/local/lib /libfoo.dylib "hoặc đường dẫn tương đối như" ../../foo/build/Release/libfoo.dylib ".(Lưu ý rằng đường dẫn tương đối bình thường có liên quan đến thư mục làm việc hiện hành, không thực thi hoặc thư mục bó.)

Bạn có thể thấy nơi myexe đang tìm kiếm bằng cách làm này:

otool -L myexe 

Bất cứ điều gì mà không nhìn vào @ executable_path (trừ thứ trong/lib và/usr/lib, là một phần của hệ điều hành và không cần phải được phân phối), bạn có thể khắc phục như thế này:

install_name_tool -change ../../../mydl/build/Release/libmydl.dylib @executable_path/libmydl.dylib myexe 

Bây giờ, bạn chỉ cần sao chép tất cả những dylibs ngay bên cạnh myexe, tar nó lên, và đưa nó cho bạn của bạn, và anh ta có thể bỏ nó và chạy exe.

+0

Một điều tôi cần phải đề cập nhưng không: Nếu bạn muốn sử dụng libs tĩnh, bạn cần kiểm tra xem các giấy phép có tương thích hay không. Tôi sẽ chỉnh sửa câu trả lời. – abarnert

+1

Spot on - về install_name_tool tuy nhiên, bạn đang thiếu một thực tế là bạn cần tên của thực thi ở cuối dòng quá. – Damian

+0

@Damian: Tốt, cảm ơn. Đã chỉnh sửa câu trả lời. – abarnert

-1

Trên Mac OS X các dylib thường được lưu trữ tại "/ usr/local /". Theo mặc định, tất cả các ứng dụng tìm kiếm bất kỳ dylib bắt buộc nào trong "/ usr/local /".

Tùy chọn 1 là đặt các dylib trong máy bạn bè của bạn "/ usr/local /".

Tùy chọn 2, đặt các dylib trong cùng thư mục với tệp thực thi của bạn.

Tùy chọn 3, Khắc phục đường dẫn trong ứng dụng hoặc dylib. XCode dylib looking in /usr/lib sẽ hữu ích. Bạn có thể sử dụng tùy chọn này để đóng gói các dylib vào vị trí bạn chọn, ví dụ như cả bên trong và bên ngoài gói ứng dụng.

+2

Ứng dụng không tìm kiếm dylibs trong/usr/local. Bạn có thể có nghĩa là/usr/local/lib, nhưng thậm chí đó chỉ là một phần chính xác. Trang manpage trên dyld giải thích vị trí của chúng (xem trong DYLD_LIBRARY_PATH và DYLD_FALLBACK_LIBRARY_PATH). – abarnert

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