当前位置: 首页 > 知识库问答 >
问题:

我应该在哪里放置一个静态库,这样我就可以将它与Rust程序链接起来?

韩彦君
2023-03-14
#[link(name = "test")]
extern {

该库已构建,其名称为libtest.a

我不知道把它放在哪里。我已经尝试了几个地方,但在执行货物运行时仍然存在这种类型的错误

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:finn-ltest的翻译

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

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

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

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

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

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

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

共有1个答案

魏晨
2023-03-14

静态库应该放在哪里

你想去哪就去哪。你必须告诉编译器在哪里可以找到它。

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

$ cat hello.c
int square(int value) {
  return value * value;
}
$ gcc -c -o hello.o hello.c
$ ar rcs libhello.a hello.o
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命名约定,并创建一个专用于公开底层API的板条箱。重要的是,这个板条箱应该指定link清单密钥,以避免链接时出现重复的符号。

 类似资料:
  • 在Vaadin 10-14中,我应该将静态文件放在哪里,例如CSS、JavaScript和聚合模板?静态文件(如图像)如何? 此外,如何在Vaadin中导入这些文件?Vaadin 14与npm和Vaadin 10-13与bower之间有差异吗?

  • 问题内容: 我使用netfishs 6.7.1和glassfish v2.1编写了一个Web服务项目,将log4j.properties放入项目的根目录并使用: 在构造函数中: 在功能上: 但是,这是错误信息(实际上,我已经尝试将它几乎可以实现的每个目录都放入): 问题答案: 我知道回答这个问题有点晚了,也许您已经找到了解决方案,但是我将发布我找到的解决方案(在我进行大量Google搜索之后),因

  • 问题内容: 关于组织单元测试,我有两个问题。 我是否必须将测试放在与测试类相同的程序包中,或者可以在不同程序包中组织测试? 例如,如果我具有 有效性 和 其他 测试,即使它们属于同一班级,将它们分成不同的包是否正确? 模拟和存根类呢?我应该将它们与仅包含测试的软件包分开,还是放在一起? 问题答案: 我们执行JUnit测试用例的方法是将它们放在相同的包中,但放在不同的根目录中。由于我们使用Maven

  • 我需要找出哪个线程当前拥有锁。 我正在使用线程池编写一个托管独立应用程序实例的多线程服务器。当关闭应用程序实例时,我调用监控器。TryEnter获取锁或超时。如果超时发生,我需要获取哪个线程拥有锁,以便我可以中止它。 如果应用程序中没有bug,我将永远不需要这样做,因为每个工作人员都会在进入和退出应用程序时锁定和解锁应用程序实例。但是,如果有一个bug,无论出于何种原因,工作人员没有退出,或者处于

  • 问题内容: 首先,我知道如何构建Java应用程序。但是我总是对在哪里上课感到困惑。支持以严格面向领域的方式组织软件包的支持者,其他支持者则按层分开。 我本人一直有问题 命名, 放置 所以, 您将域特定的常量放在哪里(以及此类的最佳名称是什么)? 您在哪里放置基础结构和领域特定的东西的类(例如,我有一个FileStorageStrategy类,该文件将文件存储在数据库中,或者存储在数据库中)? 在哪

  • 问题内容: 我在python中有自己的软件包,并且经常使用。我应该在哪里放置软件包,以便在不使用PYTHONPATH或sys.path的情况下将其导入,这是什么最优雅或传统的目录? 例如,网站包呢? 。 在python中复制并粘贴软件包是否很常见? 问题答案: 我通常将要准备导入的内容放在用户站点目录中: 要显示适合您平台的目录,可以使用 编辑:创建后将显示在其中: