我应该在哪里放置一个静态库,以便将其与Rust程序链接?

Ang*_*gel 10 rust

我不知道如何将C库链接到Rust.这就是我所做的:

我的lib.rs文件包含

#[link(name = "test")]
extern {
Run Code Online (Sandbox Code Playgroud)

该库已建立并具有名称libtest.a.

我不知道该把它放在哪里.我已经尝试了几个地方,但在做这个时我仍然有这种类型的错误cargo run

error: linking with `cc` failed: exit code: 1
//..
note: /usr/bin/ld: no se puede encontrar -ltest
note: /usr/bin/ld: no se puede encontrar -ltest
note: /usr/bin/ld:.......
//..
Run Code Online (Sandbox Code Playgroud)

上述翻译/usr/bin/ld: no se puede encontrar -ltest- >usr/bin/ld: cannot find -ltest

我不知道往哪里放libtest.a,这样/usr/bin/ld可以找到它.Cargo没有告诉我图书馆应该在项目中的哪个位置.

我的Cargo.toml包含

[dependencies.test]
path = "./src/test"

[dependencies]
bitflags = "0.7"
libc = "0.2"

[build-dependencies]
make-cmd = "0.1"
Run Code Online (Sandbox Code Playgroud)

在再次阅读文档的FFI部分之后,我认为可能之前的错误消息是因为我在寻找共享库,所以我做了以下更改:

#[link(name = "test", kind = "static")]
Run Code Online (Sandbox Code Playgroud)

在这些更改之后,我仍然不知道如何指出库的位置,但现在消息告诉我:

error: could not find native static library `test`, perhaps an -L flag is missing?
Run Code Online (Sandbox Code Playgroud)

She*_*ter 9

我应该在哪里放置一个静态库

哪里都行.你必须告诉编译器在哪里找到它.


首先,让我们创建一个静态库

$ cat hello.c
int square(int value) {
  return value * value;
}
$ gcc -c -o hello.o hello.c
$ ar rcs libhello.a hello.o
Run Code Online (Sandbox Code Playgroud)

接下来,我们使用构建脚本来设置rustc-link-search指向我放置库的目录的值:

fn main() {
    println!("cargo:rustc-link-search=/Projects/stack-overflow/using-c-static/");
}
Run Code Online (Sandbox Code Playgroud)

我们现在可以使用库中的函数:

#[link(name = "hello")]
extern "C" {
    fn square(val: i32) -> i32;
}

fn main() {
    let r = unsafe { square(3) };
    println!("3 squared is {}", r);
}
Run Code Online (Sandbox Code Playgroud)

这是基本功能.您还可以使用构建脚本指定要链接的库,而不是在代码中使用它(rustc-link-lib).我更喜欢这个,因为这两个配置紧挨着.

您还应该遵循*-sys命名约定并创建一个专门用于公开底层API的包.重要的是,此包应指定link清单键以避免链接时出现重复符号.

如果构建脚本需要更多信息,则货物通过环境变量传递许多参数.

如果您正在编译C代码作为您的包的一部分,您应该查看像cccmake这样的包,这使得构建一个软件的行为更容易.


Ang*_*gel 5

我刚刚找到了一个解决方案(二),但我不知道这是否是最好的方法:

1

build.rs 文件

extern crate gcc;

fn main() {

    println!("cargo:rustc-link-search=native=/home/path/to/rust/proyect/folder/contain/file.a");
    println!("cargo:rustc-link-lib=static=test");
}
Run Code Online (Sandbox Code Playgroud)

Cargo.toml

//..
build = "build.rs"
//..
Run Code Online (Sandbox Code Playgroud)

2

Cargo.toml

//..
rustc-link-search = ["./src/lib"]
rustc-link-lib = ["test"]
root = "/home/path/to/rust/proyect/"
//..
Run Code Online (Sandbox Code Playgroud)

["./src/lib"] -> 放置到 lib.a 对 root 的引用