2015-06-18 16 views
7

Theo dõi câu hỏi này here, tôi đang gặp sự cố khi sử dụng dyn.load để tải thư viện được liên kết với Rust dylib. Tôi nghi ngờ nó có một cái gì đó để làm với nơi R là tìm kiếm các dylib Rust, nhưng tôi đã không tìm thấy một cách để xác định vị trí khác hơn bất cứ điều gì mặc định là.Tải thư viện được chia sẻ được liên kết với thư viện Rust trong R

Từ R, tôi thực hiện như sau:

> dyn.load('src/test.so') 

Và nhận được thông báo lỗi này:

Error in dyn.load("src/test.so") : 
    unable to load shared object '/Users/Zelazny7/r-dev/rustr/src/test.so': 
    dlopen(/Users/Zelazny7/r-dev/rustr/src/test.so, 6): Library not loaded: libglue.dylib 
    Referenced from: /Users/Zelazny7/r-dev/rustr/src/test.so 
    Reason: image not found 

Làm thế nào để tải một thư viện chia sẻ mà phụ thuộc vào một thư viện chia sẻ?

documentation cho dyn.load không chỉ định cách thực hiện việc này.

Cập nhật:

Nhờ shepmaster tôi đã có thể xây dựng thành công và nhập khẩu một thư viện được chia sẻ trong R. Các thư viện chia sẻ đã được biên soạn bằng C và được tự liên kết với một thư viện Rust. Đây là những bước của tôi:

  1. Compile chia sẻ thư viện Rust
  2. Compile chia sẻ thư viện C và liên kết đến các thư viện Rust bằng cách sử dụng lệnh sau đây (trong Windows như tôi tại nơi làm việc sáng nay)

nội dung thư mục My:

C:\Users\gravesee\test>ls 
rglue.dll rglue.rs rustr.c treble.h 

Biên dịch thư viện chia sẻ thức:

gcc -shared -m64 -I"C:\Program Files\R\R-3.2.0\include" rustr.c -L"C:\Program Files\R\R-3.2.0\bin\x64" -lR -L. -lrglue -o test.dll 

Đang tải thư viện trong R:

> dyn.load("test.dll") 
> is.loaded("triple") 
[1] TRUE 
> .Call("triple", as.integer(32)) 
The triple is 96 

Trả lời

4

Vấn đề đang xảy ra để đun sôi xuống đến một thực tế rằng các thư viện chia sẻ của bạn không nằm trong thư mục hệ thống của bạn hy vọng họ được theo mặc định.

Có một vài thủ thuật mà bạn có thể sử dụng, 2 trong số đó tôi đã có thể làm cho công việc:

  1. Run R từ cùng một thư mục bạn biên soạn các thư viện.

  2. Đặt LD_LIBRARY_PATH (Linux) hoặc DYLD_LIBRARY_PATH (OS X) trước khi tung ra R.

    DYLD_LIBRARY_PATH=/path/to/rust/lib/ R 
    
  3. Bạn nên có thể thiết lập các rPath khi xây dựng các thư viện chia sẻ.

    g++ -shared treble.cxx -o treble.so -L/tmp/ -Wl,-rpath,/tmp -lglue 
    

    Tuy nhiên, tôi không thể làm điều này hoạt động tốt trên OS X, vì vậy tôi không chắc mình đang làm gì sai.

  4. (OS X chỉ) Sau khi xây dựng thư viện của bạn C++, bạn có thể thay đổi cài đặt tên đó đề cập đến các thư viện Rust gốc và bao gồm các đường dẫn tuyệt đối:

    install_name_tool -change libglue.dylib /tmp/libglue.dylib treble.so 
    

Về cơ bản, bạn sẽ muốn tìm cách chia sẻ các thư viện phụ thuộc vào các thư viện chia sẻ khác khi nhiều thư viện không tồn tại trong các đường dẫn tìm kiếm linker mặc định của bạn.

Nguồn

Linking a dynamic library (libjvm.dylib) in Mac OS X (rpath issue)

Print rpath of executable on OSX

@executable_path, @load_path and @rpath

How do I modify the install name of a .dylib at build time

clang, change dependent shared library install name at link time

+0

Cảm ơn bạn! Tôi sẽ đọc thêm về rpath nhưng tôi đã có thể tải thư viện được chia sẻ bằng cách khởi chạy R từ cùng một thư mục. Tôi đã học hỏi được rất nhiều câu hỏi này. – Zelazny7

0

Mặc dù câu trả lời ban đầu là tốt, tôi đưa ra một cách tiếp cận thay thế cho điều này here.

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