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

时间:2019-09-03 12:03:27

标签: sqlite rust rust-cargo

我创建了一个rust应用程序,该应用程序使用了crates.io中的sqlite条板箱

我只是按原样使用此板条箱,而当我使用cargo run运行应用程序时,我确实得到了想要的东西。但是,看来我的应用程序现在已经依赖于sqlite3.dll,它必须在我的路径中。

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

在我自己的计算机上,我只需将sqlite3.dll复制到路径中的文件夹中,或者复制到相同的目录中,即可在其中创建我的可执行文件。

但是,我意识到这不适用于任何sqlite3.dll文件,但可以与我在.multirust文件夹下的某个位置找到的文件一起使用。

另外,当我将此应用程序提供给其他人时,我还必须确保DLL也存在。

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

是否有一种方法可以告诉Cargo静态链接此C库,而无需深入研究自定义构建脚本?

1 个答案:

答案 0 :(得分:2)

sqlite板条箱依赖于sqlite3-sys板条箱向SQLite提供FFI。反过来,此板条箱取决于sqlite3-src板条箱,该板条箱包含一个称为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)