Rust 编译模式之间的区别
Difference between Rust compile modes
我是 Rust 新手。
因为我以前在 Jetbrains IDEs 中编写了很多代码(当然是用 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 --release
,Run
表现得像 cargo
(没有 --release
),不知道为什么。
你可能会怀疑那是因为我写了一些依赖构建类型的代码,但至少在 Rust 部分不是这样。至于 C 库,它已经被编译了,我不认为不同的 rust 编译类型会改变它里面的东西。
我检查了 CLion 中的 Rust 配置,没有发现与构建模式相关的项目。
好的,这就是上下文,我的问题来了:
- 默认情况下 Intellij
Run selected configuration
/Debug selected configuration
for Rust 有什么区别
- 为什么 Intellij
Debug
/Run
的行为与 cargo --release
/cargo
相反
- 当我在 Rust 中没有依赖于模式的代码时,什么可能导致编译模式之间的不同行为。(这里没有第三方包)
对于那些遇到类似问题的人,不仅在 Rust 中,而且在其他编程语言中,我找到了不同行为的原因:
动态库乱七八糟
我是这样命名的,不知道对不对,但是描述同一个动态库的多个版本在你的电脑不同的路径可能会出现我遇到过的奇怪问题
如果您遇到这种情况,请使用 ldd
检查库依赖性。
另外,记得清理所有缓存。
我是 Rust 新手。
因为我以前在 Jetbrains IDEs 中编写了很多代码(当然是用 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 --release
,Run
表现得像 cargo
(没有 --release
),不知道为什么。
你可能会怀疑那是因为我写了一些依赖构建类型的代码,但至少在 Rust 部分不是这样。至于 C 库,它已经被编译了,我不认为不同的 rust 编译类型会改变它里面的东西。
我检查了 CLion 中的 Rust 配置,没有发现与构建模式相关的项目。
好的,这就是上下文,我的问题来了:
- 默认情况下 Intellij
Run selected configuration
/Debug selected configuration
for Rust 有什么区别 - 为什么 Intellij
Debug
/Run
的行为与cargo --release
/cargo
相反
- 当我在 Rust 中没有依赖于模式的代码时,什么可能导致编译模式之间的不同行为。(这里没有第三方包)
对于那些遇到类似问题的人,不仅在 Rust 中,而且在其他编程语言中,我找到了不同行为的原因:
动态库乱七八糟
我是这样命名的,不知道对不对,但是描述同一个动态库的多个版本在你的电脑不同的路径可能会出现我遇到过的奇怪问题
如果您遇到这种情况,请使用 ldd
检查库依赖性。
另外,记得清理所有缓存。