首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在哪里放置一个静态库,这样我才能将它与一个Rust程序连接起来?

我应该在哪里放置一个静态库,这样我才能将它与一个Rust程序连接起来?
EN

Stack Overflow用户
提问于 2017-05-07 00:11:05
回答 3查看 21.8K关注 0票数 26

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

我的lib.rs文件包含

代码语言:javascript
复制
#[link(name = "test")]
extern {

库是构建的,其名称为libtest.a

我不知道该放在哪里。我尝试过几个地方,但是在执行cargo run时仍然存在这种类型的错误。

代码语言:javascript
复制
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.toml包含

代码语言:javascript
复制
[dependencies.test]
path = "./src/test"

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

[build-dependencies]
make-cmd = "0.1"

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

代码语言:javascript
复制
#[link(name = "test", kind = "static")]

在这些更改之后,我仍然不知道如何指出库在哪里,但是消息现在告诉我如下:

代码语言:javascript
复制
error: could not find native static library `test`, perhaps an -L flag is missing?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-07 04:33:41

我应该把静态库放在哪里?

你想去哪里都行。你必须告诉编译器在哪里能找到它。

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

代码语言:javascript
复制
$ cat hello.c
int square(int value) {
  return value * value;
}
$ gcc -c -o hello.o hello.c
$ ar rcs libhello.a hello.o

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

代码语言:javascript
复制
fn main() {
    println!("cargo:rustc-link-search=/Projects/stack-overflow/using-c-static/");
}

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

代码语言:javascript
复制
#[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)中链接它。我更喜欢这个,因为这两个配置是相邻的。

您还应该遵循命名约定并创建一个专门用于公开底层API的机箱。重要的是,这个机箱应该指定舱单密钥,以避免在链接时重复符号。

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

如果您正在编译C代码作为您的机箱的一部分,您应该查看像抄送cmake这样的板条箱,这使得构建一段软件变得更加容易。

票数 30
EN

Stack Overflow用户

发布于 2017-05-07 04:56:32

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

1-方法

build.rs文件

代码语言:javascript
复制
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");
}

Cargo.toml

代码语言:javascript
复制
//..
build = "build.rs"
//..

2-方法

Cargo.toml

代码语言:javascript
复制
//..
rustc-link-search = ["./src/lib"]
rustc-link-lib = ["test"]
root = "/home/path/to/rust/proyect/"
//..

["./src/lib"] -> place to lib.a refence to root

票数 7
EN

Stack Overflow用户

发布于 2021-05-11 11:32:56

如果您不想指定库的路径,并且您是在Linux上,您可以将它放在"usr/local/lib“中,然后在main.rs中这样说它的名称:

代码语言:javascript
复制
#[link(name = "theLibraryname", kind = "")]

此外,还可以将任何头文件放置在“包含”文件夹中。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43826572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档