Как использовать скомпилированный C .so файл в ржавчине - PullRequest
1 голос
/ 15 февраля 2020

обновлен из-за некоторых предложений


Система: macOS 10.14.6

Вопрос, который я хочу задать здесь, - как мне используйте ржавчину для вызова скомпилированного .so файла, извините, я новичок в этой части.

У меня есть очень простой c файл:

#include "add.h"

int add(int a, int b) {
    return a + b;
}

Тогда я использовал gcc-fPIC -shared -o libadd.so add.c чтобы скомпилировать его в файл .so и поместить в каталог lib

Затем я написал это в файле build.rs ржавчины:


use std::env;
use std::path::{Path};

fn main() {
    let pwd_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
    let path = Path::new(&*pwd_dir).join("lib");
    println!("cargo:rustc-link-search=native={}", path.to_str().unwrap());
    println!("cargo:rustc-link-lib=dylib=add");
    // println!("cargo:rustc-link-lib=static=add");
    // println!("cargo:rerun-if-changed=src/hello.c");
}

Я ожидаю, что смогу получить и используйте эту функцию, main.rs:

extern { fn add(a: i32, b: i32) -> i32; }

fn main() {
    let c = unsafe { let d = add(3, 5); d };
    println!("c: {:?}", c);
}

cargo build в порядке, но cargo run с ошибкой:

   Compiling hello-from-generated-code-3 v0.1.0 (/Users/niexiaotao/work/rust-server/rust-ffi/hello-from-generated-code-3)
    Finished dev [unoptimized + debuginfo] target(s) in 0.34s
     Running `target/debug/hello-from-generated-code-3`
dyld: Library not loaded: libadd.so
  Referenced from: /Users/niexiaotao/work/rust-server/rust-ffi/hello-from-generated-code-3/target/debug/hello-from-generated-code-3
  Reason: image not found
[1]    81811 abort      cargo run

другое: я изменяю .so на. а и машина go пробег в порядке.

Пример кода здесь

Спасибо за помощь!

...