【问题标题】:Proper way to make and use Rust shared libraries?制作和使用 Rust 共享库的正确方法?
【发布时间】:2014-08-24 02:47:31
【问题描述】:

我正在为一个 cpp 库做绑定。 为此,我为该库编写了一个 capi / 包装器,并将其编译为一个共享库(.so 文件)。

我的问题是,如何在不强制用户安装的情况下使用该文件并将其集成到 cargo 中?目前我通过从 Cargo.toml 中的构建变量调用的 Makefile 构建 cpp,但我不确定如何处理已编译的 lib。

为了测试,我可以使用 rpath 或 LD_LIBRARY_PATH 将可执行文件指向正确的位置,但这在分发库时不起作用。

人们是如何管理这个的?

【问题讨论】:

    标签: shared-libraries rust rust-cargo


    【解决方案1】:

    首先,确定你是否真的需要一个共享库。从您的问题中不清楚,但如果您将 您自己的 包装器编译到共享库中,这可能是不必要的 - 您可以将代码编译到静态库中并将其直接链接到您的可执行文件中。

    此外,您也可以尝试静态链接该第三方库。我认为这应该不难。是的,您现在需要在清单中使用build 命令来执行所有这些操作。

    但是,如果您仍然需要使用共享库并且您不希望最终用户自己安装它(这很奇怪,因为这是共享库的意义),您有手动分发它。例如,您可以编写一个生成文件,该文件组合了您的用户可以提取和使用的存档。为了让您的程序正确找到库,您要么让用户将此存档安装到系统根目录中(例如,Linux 上的 /usr;然后将自动定位此共享库),要么您必须编写小型 shell 脚本包装器围绕您的可执行文件,它将找到共享库并设置适当的LD_LIBRARY_PATH

    我会选择第一条路。通常所有主要平台都提供创建安装包的方法(Linux 上的 deb/rpm/pkg.tar.xz/whatever,Mac 上的 brew,Windows 上的 windows 安装程序,但在 Windows 上,您可以将共享库放在与可执行文件,它将工作)。您只需为用户工作的平台创建包,这样您的程序将安装在正确的目录中,并且您的共享库将自动解析。

    【讨论】:

    • 感谢您列出选项并将所有内容放在上下文中。我认为首先没有共享库可能是最好和最简单的解决方案。我会调查的。有问题的图书馆是犰狳顺便说一句。它以共享的形式分发,所以我想我也会让我的包装器共享。
    • 移动到静态库确实有效。对其他任何人的快速评论:在 rust 中,您将需要链接到您的静态库,您的静态库使用的共享库,以及作为我绑定的库的 stdc++ 来自 c++。
    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2019-06-27
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多