2009-12-20 9 views
18

tôi đang liên kết một (phần mở rộng Python) thư viện nhúng engine với lệnh sau đây Matlab (được tạo ra sử dụng cmake)Liên kết đến một thư viện động trên máy Mac với đường dẫn đầy đủ

c++ -mmacosx-version-min=10.6 -bundle -headerpad_max_install_names -o library.so library.o /Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib /Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib -framework Python 

dẫn đến

$ otool -L library.so 
library.so: 
    @loader_path/libeng.dylib (compatibility version 0.0.0, current version 0.0.0) 
    @loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0) 
    /System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1) 
    /opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.13.0) 
    /opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0) 

Tuy nhiên, khi tôi cố gắng sử dụng thư viện, tôi nhận được một thông báo lỗi:

ImportError: dlopen(./library.so, 2): Library not loaded: @loader_path/libmex.dylib 
    Referenced from: ./library.so 
    Reason: image not found 

tôi tin vấn đề xuất phát từ thực tế là mối liên kết bao gồm các tệp dylib matlab dưới dạng @loader_path/libeng.dylib thay vì sử dụng đường dẫn đầy đủ, mặc dù tôi cung cấp đường dẫn đầy đủ đến g++. Làm thế nào tôi có thể buộc các mối liên kết để sử dụng đường dẫn đầy đủ?

Tôi biết một giải pháp là sử dụng

export DYLD_LIBRARY_PATH=/Applications/MATLAB_R2009b.app/bin/maci64:$DYLD_LIBRARY_PATH 

đó là nơi các tập tin thư viện cư trú, nhưng tôi muốn tránh điều đó vì nó gây ra một số vấn đề khác.

+0

Vui lòng tham khảo câu trả lời của tôi trong liên kết này [Add_libray] [1] [1]: http://stackoverflow.com/questions/4876740/xcode-keeps-searching-dylib-at-wrong- path/19245310 # 19245310 – itechnician

Trả lời

29

thủ thay đổi các tập tin sử dụng install_name_tool

install_name_tool -change "@loader_path/libeng.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib" library.so 
install_name_tool -change "@loader_path/libmx.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib" library.so 

tôi có thể sử dụng như là một sửa chữa tạm thời, nhưng tôi tự hỏi, nếu không có một giải pháp tốt hơn nơi trình liên kết được cung cấp một cài đặt để sử dụng đường dẫn đầy đủ.

+2

điều này rất hữu ích, nhưng bạn nói đúng, nên có cách để thực hiện điều này trong CMake – eqzx

+0

Tôi đã kết thúc việc cần thực hiện thao tác nghịch đảo; thay thế đường dẫn tuyệt đối bằng đường dẫn '@ loader_path'. [Trang người dùng dyld] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html) hữu ích trong việc giải thích hành vi của dyld vì nó liên quan đến các đường dẫn tuyệt đối và mở rộng '@ loader_path'. – nornagon

5

Xem tùy chọn -rpath tới lệnh ld để kiểm soát điều này. Bạn cũng có thể quan tâm đến nội dung của https://github.com/bimargulies/jni-origin-testbed, đây là một minh chứng về một số công nghệ liên quan.

Kỹ thuật quan trọng ở đây là:

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so 
+1

Bạn có thể giải thích thêm một chút về điều này không? Tôi đang gặp vấn đề tương tự. Tôi cảm thấy như một vài con đường trong dự án được xây dựng của tôi không nhìn vào đúng chỗ! – Yasin

-2

Bạn cũng có thể sử dụng liên kết tượng trưng!

+1

bạn đã đọc các câu trả lời khác và hiểu vấn đề chưa? –

6

Lưu ý rằng một số vấn đề với DYLD_LIBRARY_PATH có thể được ngăn chặn bằng cách sử dụng DYLD_FALLBACK_LIBRARY_PATH để thay thế. Điều này sẽ chỉ được sử dụng nếu không thể tìm thấy lib trong các đường dẫn mặc định.

+0

Sử dụng điều này vừa phá vỡ vỏ tôi đã ở, và đã cho tôi: '' ' python dyld: Thư viện không được tải: @loader_path /../ lib/libpython2.7.dylib Tham chiếu từ: .../bin/python Lý do: không tìm thấy hình ảnh Dấu vết/BPT: 5 '' ' –