我想用我的铁 rust 代码创建一个.deb包.它由另一个库机箱和一个二进制机箱使用的库(机箱)组成.所以像这样的东西

- core_lib
- pam_lib (uses core_lib)
- cli_binary (uses core_lib)

问题1

当然,问题是解决依赖关系:-)我try 了两种方法:

Dynamic linking

在编译代码时,我可以强制将共享库的位置设置为cargo rustc -r -- -C link-args='-Wl,-rpath,/usr/lib/x86_64-linux-gnu/mylib'.然而,当我这样做并对包进行dpkg build操作时,lintian返回错误:custom-library-search-path.

Adding to ldconfig

我还可以将新的配置文件添加到/etc/ld.so.conf.d/,并设置/usr/lib/x86_64-linux-gnu/mylib目录的路径,然后在postinst脚本中执行sudo ldconfig以更新值.但是is this the right way to go?我不想遵循任何反模式.

问题2

我在这些依赖项上遇到的另一个问题是,当我编译任何一个‘最终’二进制文件时,它也会编译target/release文件夹中的core_lib.到现在为止还好.但是当我编译pam_libcli_binary时,libcore_lib.so是不同的(甚至字节大小也有些不同),我不能互换使用它们.即使当我独立编译core_lib并使用该构件时也不是如此;运行任何一个二进制返回unknown symbol,后跟对core_lib中的函数的引用.

一种可能的解决方案是将libcore_lib.so复制两次到不同的目录(从它们自己的target/release目录中的每个二进制文件复制一次),但由于它被认为是一个共享引用,这似乎完全是……太蠢了.

有什么好主意吗?

核心库Cargo.toml:

[package]
name = "core-lib"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["dylib"]

[dependencies]
...

和二进制文件Cargo.toml:

[package]
name = "cli-binary"
version = "0.1.0"
edition = "2021"

[dependencies]
core-lib = { path = "../../Rust core/core-lib" }
...

推荐答案

好吧,最愚蠢的部分是……我:-)

我也在浏览Rust论坛,偶然发现了topic that resembled mine--果然,当我将core_lib的类型从dylib改为lib时,它开始工作了.我只是无缘无故地用dylib给自己施加了很多头痛(很久以前就切换到那个了,原因我已经记不清了……叹息).

无论如何,希望它也能帮助其他人.

Rust相关问答推荐

如果A == B,则将Rc A下推到Rc B

如何导出 rust 色二进制文件中的符号

使用模块中的所有模块,但不包括特定模块

有没有办法避免在While循环中多次borrow `*分支`

默认特征实现中的生命周期问题

写入引用会更新基础值,但引用会打印意外的值

为什么`tokio::main`可以直接使用而不需要任何导入?

Rust 并行获取对 ndarray 的每个元素的可变引用

Rust 程序中的内存泄漏

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

使用 traits 时,borrow 的值不会存在足够长的时间

为什么在 macOS / iOS 上切换 WiFi 网络时 reqwest 响应会挂起?

如何在 Rust 中创建最后一个元素是可变长度数组的 struct ?

意外的正则表达式模式匹配

具有生命周期和以后引用的可变方法

如何为返回正确类型的枚举实现 get 方法?

tokio async rust 的 yield 是什么意思?

基于名称是否存在的条件编译

如何在 Rust 中链接返回结果的函数?

为什么对原语的引用没有隐式取消引用