【问题标题】:Difference between Rust compile modes [closed]Rust 编译模式之间的区别 [关闭]
【发布时间】:2019-03-20 12:10:32
【问题描述】:

我是 Rust 新手。

由于我过去在 Jetbrains IDE 中编写了很多代码(当然是使用 Ideavim),所以我决定也为 Rust 选择一个 Jetbrains IDE,更具体地说是 CLion(因为我有时还必须编写 C++)。在这里,如果您不熟悉 CLion,可以将其视为 Intellij 或 Pycharm/Rubymine/Android-studio,因为毕竟真正起作用的是由 LLDB 提供支持的 Rust 插件。

今天遇到一件很奇怪的事:

我用 C 编写了一个库,它在 C++ 项目中运行良好。在我的新 Rust 项目中,我想继续使用它,作为一个动态库。它编译得很好,但它的行为很奇怪,比如,有时记录到 std 不起作用,文件操作不起作用,等等。

经过更多调查,我发现我的测试用例会:

  • 如果我通过 CLion/Intellij Run selected configuration 运行失败
  • 如果我通过 CLI 运行失败cargo test -- --nocapture
  • 如果我通过 CLI 运行则通过 cargo test --release -- --nocapture
  • 如果我通过 CLion/Intellij Debug selected configuration 运行则通过

这里 Intellij Debug 的行为类似于cargo --releaseRun 的行为类似于cargo(没有--release),不知道为什么。

你可能会怀疑这是因为我写了一些依赖于构建类型的代码,但至少在 Rust 部分不是这样。至于 C 库,它已经编译好了,我不认为不同的 rust 编译类型会改变它里面的东西。

我检查了 CLion 中的 Rust 配置,发现没有项目与构建模式有关。

好的,这就是上下文,我的问题来了:

  • Intellij Run selected configuration/Debug selected configuration 默认为 Rust 有什么区别
  • 为什么 Intellij Debug/Run 的行为与 cargo --release/cargo 相反
  • 当我在 Rust 中没有依赖于模式的代码时,可能导致编译模式之间的行为不同的原因。(这里没有第三方 crates)

【问题讨论】:

  • 根据我的经验,当行为发生变化时,这是因为你做了一些未定义的行为,如果没有minimal reproducible example 重现你的问题,就不可能回答你。
  • 是的,你是对的,也许我只是在寻找信息而不是准确的答案。这就是为什么我没有在这里发布任何代码的原因。 @Stargateur

标签: intellij-idea compilation rust clion rust-cargo


【解决方案1】:

对于那些遇到类似问题的人,不仅在 Rust 中,而且在其他编程语言中,我找到了不同行为的原因:

动态库混乱

我这样命名,不确定是否正确,但是描述同一个动态库的多个版本位于您的计算机中,不同的路径可能会导致像我遇到的奇怪问题。

如果您遇到这种情况,请使用ldd 检查库依赖项。

另外,记得清理所有的缓存。

【讨论】:

  • 这可能解决了您的问题,但我怀疑这对将来的任何人都有用。
  • 很少@Stargateur
  • 您能否提供更多信息,供未来的读者参考?通过使用ldd,我怎么知道我是否会遇到“奇怪的问题”?
猜你喜欢
  • 1970-01-01
  • 2014-12-28
  • 2013-03-27
  • 2013-01-04
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多