如何使用panic = abort与外部依赖?

ide*_*n42 7 rust rust-cargo

对于单个crate项目,将这些行添加到Cargo.toml预期的工作.

[profile.release]
panic = "abort"
Run Code Online (Sandbox Code Playgroud)

然后构建项目:

cargo build --release
Run Code Online (Sandbox Code Playgroud)

但是,在间接使用依赖项的项目中,我收到错误.

    Compiling c_vec v1.0.12
error: the linked panic runtime `panic_unwind` is not compiled with this crate's panic strategy `abort`

error: aborting due to previous error

Build failed, waiting for other jobs to finish...
error: Could not compile `c_vec`.
Run Code Online (Sandbox Code Playgroud)

所述c_vec箱是一个间接使用依赖性.

如何panic=abort在没有冲突的多箱项目中使用?


详情请注意:

  • Rustc 1.12.0
  • 有问题的图书馆:lodepng-rust
  • Linux,64位

Lin*_*ope 5

看起来是因为c_vec指定dylib为其库类型之一。

我在 Github 上将此作为问题提交:https : //github.com/rust-lang/cargo/issues/2738

并从其中一位开发人员那里得到了答案:

啊不幸的是,这是一个糟糕的错误消息,但这是因为 c_vec 板条箱中的 crate-type = ["dylib", "rlib"] 。这会导致 Cargo 传递 -C prefer-dynamic,它链接到我们发布的针对 panic_unwind 编译的 dylib,这意味着中止模式确实无效(这个错误来自编译器)。

此处的解决方法是从 c_vec 板条箱中删除“dylib”。

当然,你必须自己分叉lodepngc_vec处理这个问题。

  • 我不记得现成的技术,但我记得读过 Cargo 支持本地依赖覆盖,所以我假设你只需要 fork `c_vec`,如果它是唯一一个指定 `dylib` 的。 (2认同)