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

Kağ*_*yal 4 sqlite rust rust-cargo

我创建了一个 Rust 应用程序,它使用crates.io 中的sqlite箱

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

从我阅读的 Cargo 文档中,我的理解是 sqlite 箱本身是静态链接的,但不是它所依赖的 C 库。

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

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

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

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

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

har*_*mic 6

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

为此,请手动指定对此包的依赖关系,如下所示:

[dependencies.sqlite3-src]
version="0.2"
features=["bundled"]
Run Code Online (Sandbox Code Playgroud)

执行此操作后,生成的二进制文件不应链接到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)
Run Code Online (Sandbox Code Playgroud)