2010-01-22 20 views
8

Tôi đang phát triển một ứng dụng sử dụng thư viện GStreamer. Để dễ dàng triển khai, tôi muốn thu thập tất cả các thư viện GStreamer trong một gói cục bộ. Đối với điều này, tôi đã viết một kịch bản nhỏ mà thực hiện như sau:Cách triển khai ứng dụng phụ thuộc vào thư viện động?

  • phụ thuộc đệ quy traverse (sử dụng otool -L)
  • bản sao tất cả phụ thuộc vào một thư mục địa phương
  • làm cho tất cả các đường dẫn phụ thuộc so với @executable_path (sử dụng install_name_tool)

(Nếu bạn quan tâm, bạn có thể có một cái nhìn tại Ruby script.)

Tuy nhiên, bây giờ tôi đang nhìn thấy lỗi runtime trên gst_init gọi:

(process:22843): GLib-GObject-CRITICAL **: gtype.c:2458: initialization assertion failed, use g_type_init() prior to this function 

(process:22843): GLib-CRITICAL **: g_once_init_leave: assertion `initialization_value != 0' failed 

Những lỗi này chỉ xảy ra nếu tôi sử dụng các thư viện địa phương.


Có một số 'cạm bẫy phổ biến' khi nói đến việc sử dụng install_name_tool không? Có ai có một ý tưởng những gì tôi có thể làm sai? Nếu bạn cần biết một số chi tiết thì hãy hỏi.

Cập nhật
tôi đã thay đổi một vài điều:

  • Đối với các thư viện phụ thuộc bây giờ tôi chỉ thay đổi đường dẫn dylib và không phải là id (chỉ sử dụng install_name_tool -change và không install_name_tool -id).
  • Đối với thư viện chính, tôi đặt giá trị id tương ứng với đường dẫn thực thi (@executable_name/components/Video.dylib).

Hai thay đổi này làm cho nó hoạt động. Tuy nhiên nó vẫn chưa rõ ràng tại sao nó hoạt động. Tôi có một số rắc rối hiểu ý nghĩa của thuộc tính "id". Nó có vẻ là định danh trong các hình thức của một tên đường dẫn. Tại sao thay đổi nó cho các thư viện phụ thuộc gây ra lỗi thời gian chạy? Tôi sẽ cố gắng tìm câu trả lời cho những câu hỏi đó với một số thử nghiệm khác ...

+0

Bạn có thể ảnh hưởng đến thứ tự tải cho các phụ thuộc tương ứng không? –

+0

@gf: Tôi không nghĩ vậy, nhưng tôi sẽ ghi nhớ điều đó. Tôi đã thực hiện một số tiến bộ, kiểm tra chỉnh sửa nếu bạn quan tâm. – StackedCrooked

+0

Bạn không xây dựng một gói .app? –

Trả lời

1

có thể bạn nên xem xét việc biên dịch tĩnh mã của mình. này sẽ đính kèm phụ thuộc của bạn để chương trình của bạn tốt hơn nhiều

nếu bạn đang sử dụng gcc chỉ cần thêm -static

0

GStreamer là một hệ thống phức tạp, với rất nhiều phụ thuộc. Sử dụng các công cụ sẽ tìm ra các thư viện được chia sẻ trực tiếp theo yêu cầu của GStreamer, nhưng chắc chắn chúng sẽ bỏ lỡ các thư viện được nạp tự động, các tệp cấu hình và cả dữ liệu dịch.

This site probably contains some usefull info khi tạo gói GStreamer độc lập, có thể đơn giản hóa quá trình chạy gói.

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