如何在 Rust 中指定链接器路径?

2023-12-26

我正在尝试将 Rust 程序与库声音库 http://libsound.io/。我使用的是 Windows,并且可以下载 GCC 二进制文件。如果我将它放在与我的项目相同的文件夹中,我可以像这样链接它:

#[link(name = ":libsoundio-1.1.0/i686/libsoundio.a")]
#[link(name = "ole32")]
extern {
    fn soundio_version_string() -> *const c_char;
}

但我真的想具体说明#[link(name = "libsoundio")]甚至#[link(name = "soundio")],然后在其他地方提供链接器路径。

我在哪里可以指定该路径?

我尝试过rustc-link-search建议如下:

#[link(name = "libsoundio")]
#[link(name = "ole32")]
extern {
    fn soundio_version_string() -> *const c_char;
}

And in .cargo/config:

[target.i686-pc-windows-gnu.libsoundio]
rustc-link-search = ["libsoundio-1.1.0/i686"]
rustc-link-lib = ["libsoundio.a"]

[target.x86_64-pc-windows-gnu.libsoundio]
rustc-link-search = ["libsoundio-1.1.0/x86_64"]
rustc-link-lib = ["libsoundio.a"]

但仍然只是过去"-l" "libsoundio"到 gcc 并以相同的方式失败ld: cannot find -llibsoundio。我是否遗漏了一些非常明显的东西?文档似乎表明这应该可行。


如中所述构建脚本的文档 http://doc.crates.io/build-script.html#outputs-of-the-build-script:

构建脚本打印到标准输出的所有行 [...开始]cargo:由 Cargo 直接解释 [...]rustc-link-search指示指定的值应作为 a 传递给编译器-L flag.

In your Cargo.toml:

[package]
name = "link-example"
version = "0.1.0"
authors = ["An Devloper <[email protected] /cdn-cgi/l/email-protection>"]
build = "build.rs"

和你的build.rs:

fn main() {
    println!(r"cargo:rustc-link-search=C:\Rust\linka\libsoundio-1.1.0\i686");
}

请注意,您的构建脚本可以使用 Rust 的所有功能,并且可以根据目标平台(例如 32 位和 64 位)输出不同的值。

最后,你的代码:

extern crate libc;

use libc::c_char;
use std::ffi::CStr;

#[link(name = "soundio")]
extern {
    fn soundio_version_string() -> *const c_char;
}

fn main() {
    let v = unsafe { CStr::from_ptr(soundio_version_string()) };
    println!("{:?}", v);
}

证据就在布丁中:

$ cargo run
    Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target\debug\linka.exe`
"1.0.3"

理想情况下,您将创建一个soundio-sys包,使用公约*-sys包 http://doc.crates.io/build-script.html#-sys-packages。它只是有一个构建脚本,链接到适当的库并公开 C 方法。它将使用Cargo links key http://doc.crates.io/build-script.html#the-links-manifest-key唯一标识本机库并防止多次链接到它。然后,其他库可以包含这个新包,而不必担心那些链接细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Rust 中指定链接器路径? 的相关文章

随机推荐

  • 在 Android Studio 中运行 Python 脚本 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在运行 Android Studio 2 2 3 我需要在开发过程中运行 Python 脚本来处理一些数据文件 最终的APK不需要
  • 向 NSScrollView 添加大量视图

    我正在尝试添加一个子视图 来自NSViewController 对于字典中的每个元素NSScrollView获得某种表格视图 但对单元格具有更大的灵活性 是否可以 以编程方式 放置例如100 个子视图彼此放在一起 因此您必须向下滚动NSSc
  • 更新回收视图中的单个项目。我正在使用分页库并想更新单个项目/行

    我使用提交列表将 pagedlist 值传递给适配器 当我更新单个项目时 请考虑我正在点击回收器视图中的提要的类似按钮 如何更新单个项目 我正在按照这个例子进行分页实现 https github com saquib3705 PagingL
  • SignalR 不解析传入服务器调用的 JsonSerializer

    J原始值 https github com SignalR SignalR blob master src Microsoft AspNet SignalR Core Json JRawValue cs https github com S
  • 实体管理器是否需要关闭每个查询?

    我将在一年内使用 JPA 作为数据库框架使用 Java 开发系统 每次查询时 我都不关闭EntityManager IMO的理解是JPA自动关闭实体管理器执行查询后 getSingleResult or 获取结果列表 如果没有那么垃圾收集会
  • 为什么 ob_start('ob_gzhandler') 会破坏这个网站?

    我有一个网站 如果存在 ob start ob gzhandler 则会在浏览器中抛出内容编码错误 如果我删除该语句 它就可以正常运行 该站点与许多其他站点使用相同的框架 服务器和托管包 无论声明是否在其中 它们都有效 该语句位于框架中 而
  • SendMessage WM_SETTEXT 到 TextBox 不会触发 TextChanged 事件

    我有代码获取文本框控件的句柄并使用 Windows API 来更改文本 更新文本时不会触发 TextChanged 事件 有没有办法使用 Windows API 触发 TextBox TextChanged 事件 Update 我认为该事件
  • Microsoft SQL Server 2008 主键的含义

    主键的概念对于SQL Server数据库引擎有什么意义 我的意思不是在 ID 列上创建的聚集 非聚集索引 我的意思是约束对象 主键 存在与否有什么关系吗 备择方案 更改表添加主键聚集 更改表创建聚集索引 这有什么不同吗 一般来说 KEY 是
  • Python - Pyodbc 连接错误

    我正在尝试使用Python3 4连接到SQL Server数据库 这是适合我的代码 cnxn pyodbc connect DRIVER ODBC Driver 13 for SQL Server SERVER DESKTOP GDM2HQ
  • CSS 媒体查询有多慢?

    当我组织 CSS 时 我喜欢将相关样式保留在一起 页眉样式位于一个部分 页脚样式全部位于同一位置 等等 抱歉 OOCSS 拥护者 我最近一直在尝试针对较小 较大屏幕的媒体查询 为了与我的组织方案保持一致 我必须为代码的每个部分所针对的每个屏
  • 在 Win32 控制台应用程序中使用 ShutdownBlockRequestCreate

    阻止在 Windows 7 上运行的 Win32 控制台应用程序提前终止的正确方法是什么 Vista 推出后 有关方式发生了变化应用程序关闭 http msdn microsoft com en us library ms700677 28
  • R 中指定列数的矩阵的 rowsum

    我正在尝试获取 R 矩阵中某一行的列总和 但是 我不希望对整行进行求和 而只对指定数量的列进行求和 即在本例中对角线上方的所有列进行求和 我尝试过 sum 和 rowSums 函数 但它们要么给我奇怪的结果 要么给我错误消息 为了进行说明
  • 使用 jQuery / JavaScript 进行组合键

    我很好奇我如何使用我在这个问题底部编写的以下 jQuery 插件代码来实现关键组合 到目前为止 它的工作原理是它允许用户简单地通过执行正常的 jQuery 语法来创建按键命令 并为按键命令提供一个事件 如下所示 window jkey a
  • A延伸B;类型“Pick> & B”不可分配给类型“A”.ts(2322)

    这是错误还是我误解了打字稿的内容 示例代码如下 type Omit
  • JSP 模板可以在 Java 中使用吗?

    我对 JSP 还很陌生 到目前为止 处理流程似乎是首先运行 Java 然后填充 JSP 模板 我想知道是否有一种方法可以从 Java 内部使用 JSP 模板 我的意思是 假设我在类路径上有一个简单的 SimpleDiv jsp 模板 如下所
  • 使用 mocha 运行时,仍然收到 babel-plugin-syntax-dynamic-import 动态导入的语法错误

    所有 babel 模块 插件均位于最新版本的 babel v6 上 Mocha 版本为 v4 0 1 Setup babelrc presets stage 3 env targets browsers last 2 versions no
  • 如何在 WhatsApp 中一次性向多个号码发送消息?

    我正在尝试使用 Flutter 通过 WhatsApp 向多个电话号码发送消息 sendMessage async var number 201020402642 201030666895 var baseUrl https api wha
  • 动态链接和 jQuery Lightbox 问题:在 lightbox 中加载图像...完全难住了!

    我有一个可以动态创建照片库链接的功能 当单击缩略图时 该函数还会生成更大的图像作为 div 的背景图像 我想做的是第三个事件 如果用户单击 div 中的放大图像 jQuery Fancybox 会加载 div 中显示的图像的更大版本 问题是
  • 在 Android 上运行 docker

    在 Android 4 4 KitKat 中 Google 正在将 Linux 内核升级到 3 8 版 这是 Docker 所需的内核版本 我不知道 AUFS 部分 但有没有办法通过此更新在 Android 上运行 docker 容器 根据
  • 如何在 Rust 中指定链接器路径?

    我正在尝试将 Rust 程序与库声音库 http libsound io 我使用的是 Windows 并且可以下载 GCC 二进制文件 如果我将它放在与我的项目相同的文件夹中 我可以像这样链接它 link name libsoundio 1