我想用我的铁 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_lib
或cli_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" }
...