2009-03-12 25 views
9

Tôi hiện đang phát triển một chương trình trong Qt và nó sử dụng thư viện libqextserialport.1.dylib.Làm cách nào để liên kết thư viện động trong Xcode?

tôi xây dựng nó và chạy trong x-code và nó spits lại:

dyld: Library not loaded: libqextserialport.1.dylib 
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV 
    Reason: image not found 

Thư viện nằm trong/Users/samuelreh/Desktop/QtOpenCV/qextserialport/build /.

tôi có thể chạy chương trình của tôi bằng cách thay đổi vào thư mục thực thi /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ và nhập:

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

tôi biết có lẽ có nhiều giải pháp bên cạnh điều này. Bất kỳ ai biết tốt nhất/thanh lịch nhất/dễ nhất để làm từ mã x?

Trả lời

2

Nếu tôi hiểu vấn đề của bạn một cách chính xác, ứng dụng của bạn đang xây dựng tốt, không có lỗi khi liên kết, nhưng khi bạn cố gắng khởi chạy thì không thể tìm thấy thư viện.

Điều đó không đáng ngạc nhiên, vì tệp dylib nằm trong một số thư mục tùy ý không nằm trên đường dẫn hệ thống. Bạn cần phải sao chép nó vào /usr/lib (có thể không phải là một ý tưởng hay) hoặc đưa nó vào gói ứng dụng. Cách thứ hai có lẽ là cách tiếp cận tốt hơn.

Tôi chưa bao giờ thử nó, nhưng dường như bạn cần sử dụng Copy Files Build Phase để đặt dylib bên trong gói của mình và sau đó configure Xcode để tệp thực thi của bạn biết nơi tìm thấy nó.

+0

nếu bạn đang xây dựng một tệp thực thi không có gói? – John

0

Bạn chỉ cần kéo thư viện từ thư mục vào dự án Xcode của bạn, tốt nhất vào tài nguyên nhưng nó không quan trọng (tôi tin). Tôi đã thử và không kiểm tra 'sao chép các tập tin vào gói' và nó hoạt động trong cả hai trường hợp, không chắc chắn nếu bạn cần đưa nó vào gói để triển khai.

Tôi đã thử nghiệm điều này bằng ứng dụng sqlite3 và ca cao (ca cao).

4

Tôi vừa thực hiện chính xác điều này, với dự án Gói Mô-đun. Điều này đã được đưa vào một dự án lớn hơn với một tệp thực thi riêng biệt.

Tôi đã thêm bước "Sao chép dylibs vào khung", đã sao chép các dylib vào /Foobar.bundle/Contents/Frameworks/Foobar/. Sau đó, tôi đã thêm một Run Script Giai đoạn để chạy như là bước cuối cùng, để sửa chữa những cái tên cài đặt của dylibs trong thực thi:

install_name_tool -change libBobDylan.dylib @executable_path/../Plugins/Foobar.bundle/Contents/Frameworks/Foobar/libBobDylan.dylib path/to/build/product/Foobar.Bundle/Contents/MacOS/Foobar 

Tất nhiên, libBobDylan.dylib cũng liên quan đến libBillyIdol.dylib. Vì vậy, tôi phải thêm một Run Script Phase khác vào lúc bắt đầu Target để sửa các tên cài đặt tại đây:

install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib 

Tôi có hơn một chục trong số này để liên kết; Tôi đã phải thuyết phục nhà cung cấp các dylibs để đệm đầu trang của họ để chứa nhiều thay đổi install_name của tôi ...

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