我正在为一个 cpp 库做绑定。为此,我为该库编写了一个 capi / 包装器,并将其编译为一个共享库(.so 文件)。
我的问题是,如何在不强制用户安装的情况下使用该文件并将其集成到 cargo 中?目前我通过从 Cargo.toml 中的构建变量调用的 Makefile 构建 cpp,但我不确定如何处理编译的 lib。
对于测试,我可以使用 rpath 或 LD_LIBRARY_PATH 将可执行文件指向正确的位置,但这在分发库时不起作用。
人们如何管理这个?
我正在为一个 cpp 库做绑定。为此,我为该库编写了一个 capi / 包装器,并将其编译为一个共享库(.so 文件)。
我的问题是,如何在不强制用户安装的情况下使用该文件并将其集成到 cargo 中?目前我通过从 Cargo.toml 中的构建变量调用的 Makefile 构建 cpp,但我不确定如何处理编译的 lib。
对于测试,我可以使用 rpath 或 LD_LIBRARY_PATH 将可执行文件指向正确的位置,但这在分发库时不起作用。
人们如何管理这个?
首先,确定你是否真的需要一个共享库。您的问题尚不清楚,但是如果您将自己的包装器编译到共享库中,那可能是不必要的 - 您可以将代码编译到静态库中并将其直接链接到可执行文件中。
此外,您也可以尝试静态链接该第三方库。我认为这应该不难。是的,您现在需要build
在清单中使用命令来执行所有这些操作。
但是,如果您仍然需要使用共享库并且您不希望最终用户自己安装它(这很奇怪,因为这是共享库的重点),您必须手动分发它。例如,您可以编写一个生成文件,该文件组合了您的用户可以提取和使用的档案。为了让您的程序正确找到库,您要么让用户将此存档安装到系统根目录中(例如/usr
在 linux 上;然后此共享库将自动定位),要么您必须在可执行文件周围编写小型 shell 脚本包装器这将找到共享库并设置适当的LD_LIBRARY_PATH
.
我会选择第一条路。通常所有主要平台都提供创建安装包的方法(Linux 上的 deb/rpm/pkg.tar.xz/whatever,Mac 上的 brew,Windows 上的 windows 安装程序,但在 Windows 上,您可以将共享库放在与可执行文件,它将工作)。您只需为用户工作的平台创建包,这样您的程序将安装在正确的目录中,并且您的共享库将自动解析。