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

时间:2017-05-07 00:11:05

标签: rust

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

我的 lib.rs 文件包含

#[link(name = "test")]
extern {

构建了库,名称为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:.......
//..

上述/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"

再次阅读the FFI section of the documentation之后,我认为之前的错误消息可能是因为我正在寻找共享库,所以我做了以下更改:

#[link(name = "test", kind = "static")]

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

error: could not find native static library `test`, perhaps an -L flag is missing?

2 个答案:

答案 0 :(得分:7)

  

我应该在哪里放置静态库

无论你想要什么。你必须告诉编译器在哪里找到它。

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

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

接下来,我们使用build scriptrustc-link-search的值设置为指向我放置库的目录:

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

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

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

fn main() {
    let r = unsafe { square(3) };
    println!("3 squared is {}", r);
}

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

您还应该遵循*-sys naming convention并创建一个专门用于公开底层API的包。重要的是,此包应指定link manifest key以避免在链接时出现重复符号。

如果构建脚本需要更多信息,则货物通过environment variables传递许多参数。

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

答案 1 :(得分:0)

如果你不想指定库的路径,而且你在 Linux 上,你可以把它放在“usr/local/lib”中,然后在 main.rs 中说出它的名字,如下所示:

#[link(name = "theLibraryname", kind = "")]

此外,您可以将任何头文件放在包含文件夹中。

注意:库名称没有 lib 前缀和 .a 扩展名。