使用 CodeLLDB 调试时无法打开共享库

Cannot open shared library when debugging with CodeLLDB

我正在开发一个用 Rust 编写的概念验证应用程序,最终目标是生成一个共享库 (.dll/.so),可通过 C ABI 从许多其他语言 (C++) 调用、C# 等)。我有两个简单的组件; poc 是一个 Rust 控制台应用程序,它引用 poclib 公开了一些简单的功能。到目前为止,该应用程序本身构建并运行良好,但我一直在研究如何在 VSCode 中使用 CodeLLDB 对其进行调试。

我有一个像这样的顶级“工作区”:

[workspace]

members = [
    "poc",
    "poclib"
]

poc/cargo.toml 看起来像这样:

[package]
name = "poc"
version = "0.1.0"
edition = "2018"

[dependencies.poclib]
path = "../poclib"

[dependencies]

poclib/cargo.toml 看起来像这样:

[package]
name = "poclib"
version = "0.1.0"
edition = "2018"

[lib]
crate_type = ["cdylib"]

[dependencies]
unicode-segmentation = "1.7.1"

我的 launch.json 看起来像这样:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug executable 'poc'",
            "cargo": {
                "args": [
                    "build",
                    "--bin=poc",
                    "--package=poc"
                ],
                "filter": {
                    "name": "poc",
                    "kind": "bin"
                }
            },
            "args": [ ],
            "cwd": "${workspaceFolder}"
        }        
    ]
}

当我在安装了 CodeLLDB 扩展的情况下尝试在 VSCode 中启动和调试时,应用程序构建但随后引发错误:/home/username/src/rustpoc/target/debug/poc: error while loading shared libraries: libpoclib.so: cannot open shared object file: No such file or directory。如果我只执行 cargo run,它会构建并运行良好,并且我可以验证 libpoclib.so 正在构建并放置在 ./target/debug 文件夹中。

如果我在 poclib/cargo.toml 中注释掉 crate_type 选项,它可以正常启动并且我可以命中断点,但不再创建共享库。

我尝试将 LD_LIBRARY_PATH 设置添加到 launch.json,如下所示:

"env": {
    "LD_LIBRARY_PATH": "${workspaceFolder}/target/debug"
},

这并没有解决任何问题,但它确实改变了错误消息 - 使用该设置我得到 /home/username/src/rustpoc/target/debug/poc: error while loading shared libraries: libstd-0a9489cf400f65e4.so: cannot open shared object file: No such file or directory

如何在 VSCode 中启用调试 Rust,同时仍然生成共享库?

我不明白为什么它最初会起作用,但解决方案是修复 crate_type 选项,以便我同时生成 C ABI 库和原生 Rust 库。

crate_type = ["cdylib","lib"]

使用该设置,构建输出包含用于 C 的 libpoclib.sopoc 二进制文件可以 link 静态反对的 libpoclib.rlib,以及 LLDB调试按预期工作。