2012-01-17 25 views
6

TL; DRLàm cách nào để Xcode liên kết và gỡ lỗi ứng dụng bằng Hệ thống tập tin tăng cường?

Ứng dụng mục tiêu-C được liên kết với thư viện tĩnh có liên kết động Boost Systemystem. Ứng dụng có thể chạy từ thư mục đầu ra bằng cách sử dụng Terminal, nhưng cố gắng chạy từ trình gỡ lỗi Xcode hoặc Finder cung cấp lỗi dyld: Library not loaded: libboost_filesystem.dylib <snip> Reason: image not found.

Vấn đề

Trong dự án Xcode của tôi, tôi có một cấu trúc trông như thế này:

MainProject (Objective-C) 
- static_lib_that_uses_filesystem (C++) 

Để có được tất cả mọi thứ để liên kết, tôi đã thêm libboost_system và libboost_filesystem dylibs vào "Liên kết Binary với Libraries "giai đoạn xây dựng trong MainProject.

Khi tôi cố gắng để chạy các ứng dụng từ một trong hai Xcode hoặc Finder tôi nhận được:

sharedlibrary apply-load-rules all 
warning: Unable to read symbols for libboost_filesystem.dylib (file not found). 
warning: Unable to read symbols from "libboost_filesystem.dylib" (not yet mapped into memory). 
warning: Unable to read symbols for libboost_system.dylib (file not found). 
warning: Unable to read symbols from "libboost_system.dylib" (not yet mapped into memory). 
[Switching to process 43957 thread 0x0] 
dyld: Library not loaded: libboost_filesystem.dylib 
    Referenced from: /Users/ssteele/Library/Developer/Xcode/DerivedData/MainProject-dqrhyuarllykslftblocjdzxlran/Build/Products/Debug/MainProject.app/Contents/MacOS/MainProject 
    Reason: image not found 

tôi đã thêm một xây dựng sân khấu để sao chép dylibs vào thư mục Khung trong gói, điều này không giúp đỡ. Tôi đã thay đổi điều này để sao chép chúng vào thư mục Executables cũng không hữu ích.

Có chúng trong thư mục Executables không cho phép tôi chạy ứng dụng từ Thiết bị đầu cuối.

Làm cách nào để ứng dụng có thể tìm thấy các dylib khi chạy từ Trình tìm kiếm/Xcode?

Background Thông tin

Tôi đang sử dụng Xcode 4.2 trên Lion và hiện đang nhắm mục tiêu Lion chỉ. Tôi đã xây dựng các thư viện chia sẻ của tôi cho hệ thống tập tin như thế này:

./b2 threading=multi macosx-version=10.7 --with-filesystem stage 

Điều này tạo ra libboost_system.dylib, libboost_filesystem.dylib, và cũng .a tương đương trong giai đoạn/thư mục lib, tôi tham khảo chúng trong dự án trực tiếp từ đó .

+0

Output từ otool -l bao gồm: 'tải lệnh 11 cmd LC_LOAD_DYLIB cmdsize 56 tên libboost_filesystem.dylib (bù đắp 24) thời gian tem 2 Thu Jan 1 01:00:02 1970 phiên bản hiện tại 0.0.0 phiên bản tương thích 0.0.0' –

+0

Tôi tự hỏi nếu tên đó nên bao gồm một tham chiếu @ của một số loại, như '@ executable_path/libboost_filesystem.dylib' . Tôi dường như không thể làm điều đó xảy ra. –

Trả lời

12

lib động (dylibs) trên OSX nướng trong đường dẫn mà chúng sẽ được tải từ đó. Ví dụ:

/usr/lib/some_awesome.dylib.

Khi bạn liên kết đến một dylib, trình liên kết nhúng đường dẫn này vào tệp thực thi của bạn làm nơi tìm kiếm nó trong thời gian chạy. Điều này là tốt và dễ dàng với cài đặt libs, nhưng đối với đường dẫn tương đối liên kết nó phức tạp hơn.

Khi bạn xây dựng thư viện tăng cường, chúng chỉ được đặt tên của chúng được nhúng thay vì đường dẫn đầy đủ hoặc tương đối (ví dụ: libboost_system.dylib thay vì /usr/lib/libboost_filesystem.dylib). Bạn sẽ có thể thay đổi điều này với dll-pathoption, nhưng that seems broken currently.

Để khắc phục sự cố, bạn cần phải có đường dẫn chính xác tương ứng với ứng dụng được nhúng (ví dụ: @executable_path/libwhatever.dylib) vào dylibs, có thể yêu cầu tùy chọn đường dẫn bjam để làm việc hoặc thay vào đó bạn có thể sửa để tìm ở một vị trí khác.

Để làm điều này, sử dụng một cái gì đó như sau như một bước kịch bản trong xây dựng của bạn:

install_name_tool -change libboost_filesystem.dylib @executable_path/libboost_filesystem.dylib$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH

Lưu ý rằng nếu bạn có nhiều dylibs mà tham khảo lẫn nhau với những con đường bị hỏng, bạn sẽ cần phải sửa đường dẫn giữa chúng, ví dụ

install_name_tool -change libboost_system.dylib @executable_path/libboost_system.dylib$BUILT_PRODUCTS_DIR/$EXECUTABLE_FOLDER_PATH/libboost_filesystem.dylib

Sau đây là một bài viết tốt về điều này: Creating working dylibs

+0

Cảm ơn, bằng cách sử dụng install_name_tool dường như làm những gì tôi muốn! –

0

Tôi nghĩ rằng bạn cần phải thêm đường dẫn đến thư mục mà bạn đã lưu libboost_filesystem.a trong "đường dẫn tìm kiếm thư viện"

Bấm vào hồ sơ dự án của bạn -> xây dựng cài đặt -> mở rộng "Tìm kiếm con đường" -> "đường dẫn tìm kiếm thư viện"

+1

Xin lỗi, tôi đã có thư mục 'stage/lib' trong đường dẫn tìm kiếm thư viện. –

+0

Không hoạt động. thêm/usr/local/lib của tôi vào đường dẫn tìm kiếm thư viện. vẫn không thành công. – Zangetsu

1

Vấn đề là cần tăng cường cài đặt ví dụ: b2 ..... install. Điều này sao chép các thư viện và các tiêu đề vào/usr/local/lib và/usr/local/include.

Thư viện động OSX chỉ chạy từ thư mục mà chúng được xây dựng.

Bạn có thể thay đổi thư mục cài đặt bằng cách sử dụng đối số -prefix để tăng cường xây dựng. Tuy nhiên các thư viện vẫn cần phải ở trong cùng một thư mục cho tất cả người dùng.

Nên có cách xây dựng quảng cáo làm khung và/hoặc nhúng @executable_path trong thư viện.

Cách khác là sử dụng các thư viện tĩnh của boost - chỉ tạo static hoặc xóa các thư viện động, Xcode tìm kiếm động trước khi tĩnh. Nếu sử dụng tĩnh thì đường dẫn đến các thư viện không quan trọng trong thời gian chạy vì tất cả các mã bây giờ là trong thực thi.

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