使用 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.so
和 poc
二进制文件可以 link 静态反对的 libpoclib.rlib
,以及 LLDB调试按预期工作。
我正在开发一个用 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.so
和 poc
二进制文件可以 link 静态反对的 libpoclib.rlib
,以及 LLDB调试按预期工作。