sqlite - 如何在 Cargo.toml 中静态链接 sqlite3

标签 sqlite rust rust-cargo

我创建了一个 Rust 应用程序,它使用 sqlite来自 crates.io 的 crate

我只是按原样使用这个箱子,当我用 cargo run 运行我的应用程序时,我确实得到了我想要的东西。但是,我的应用程序现在似乎依赖于 sqlite3.dll ,它需要在我的路径中。

根据我阅读的 Cargo 文档,我的理解是 sqlite crate 本身是静态链接的,而不是它所依赖的 C 库。

在我自己的计算机上,我通过简单地将 sqlite3.dll 复制到我的路径中的一个文件夹或同一目录中解决了这个问题,cargo 在其中创建了我的可执行文件。

但是,我意识到这不适用于任何 sqlite3.dll 文件,但它适用于我在 .multirust 文件夹深处找到的那个文件。

此外,当我将此应用程序交给其他人时,我还必须确保 DLL 也在那里。

因此,我想通过将此 DLL 静态链接到我的可执行文件来避免这些复杂情况。

有没有办法让 Cargo 静态链接这个 C 库,而无需深入研究自定义构建脚本?

最佳答案

sqlite crate 取决于 sqlite3-sys crate 以向 SQLite 提供 FFI。这个 crate 又取决于 sqlite3-src crate,其中包括一个名为 bundle 的可选功能 - 如果您指定此功能,那么它会将 SQLite 的副本捆绑到您的 rust 二进制文件中。

为此,手动指定对这个包的依赖,如下所示:

[dependencies.sqlite3-src]
version="0.2"
features=["bundled"]

执行此操作后,生成的二进制文件不应链接到 sqlite3.dll。我无法在 Windows 上测试它,但它适用于 Linux:

$ ldd target/debug/so_sqlite
        linux-vdso.so.1 =>  (0x00007ffcf7972000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f1781fb9000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f1781db1000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f1781b95000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f178197f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f17815b2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f17824d3000)

关于sqlite - 如何在 Cargo.toml 中静态链接 sqlite3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57771398/

相关文章:

linux - 如何配置 sqlite3 模块以使用 Django 1.10?

python - 使用 sqlite 在 Django 中进行查询过滤

Android:具有不同名称的文本主键

rust - 即使存在 `&mut T` ,我是否可以将生命周期参数强制为较短的生命周期(健全)?

rust - 如何使用分隔符将 HashSet 的元素连接到字符串中

rust - `multirust`安装Rust语言源码在哪里?

rust - 连字符无法识别的 crate 名称

sqlite - 我需要转换 hh :mm:ss to seconds

compilation - 你如何根据目标三元组有条件地编译?

rust - 如果 "cargo build"比直接运行 rustc 慢,我为什么要使用 Cargo?