Rust编译模式之间的区别

时间:2018-10-16 02:57:39

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

我是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配置,发现没有任何与构建模式有关的项目。

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

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

1 个答案:

答案 0 :(得分:0)

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

动态库混乱

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

如果遇到这种情况,请使用ldd检查库的相关性。

另外,请记住清理所有缓存。