如何通过 wasm-pack 将 Rust Wasm 应用程序与 libpq 链接?

Posted

技术标签:

【中文标题】如何通过 wasm-pack 将 Rust Wasm 应用程序与 libpq 链接?【英文标题】:How can I link a Rust Wasm application with libpq via wasm-pack? 【发布时间】:2020-02-29 00:57:30 【问题描述】:

我正在尝试创建一个带有 Wasm 数据库层的 NodeJS 应用程序。我使用 Rust、Diesel 作为数据库驱动程序和 wasm-pack 作为 WebAssembly 编译器。

当我尝试使用wasm-pack 构建服务时,尝试链接libpq 库失败。 PQ_LIB_DIR 环境变量已设置,diesel-cli 工作没有任何问题,但是当我尝试编译我的服务时它失败并出现以下错误:

error: linking with `rust-lld` failed: exit code: 1
  = note: rust-lld: error: unable to find library -llibpq

我该如何解决?

我的系统:

操作系统:Windows 10 :1.38.0 wasm 包:0.8.1 柴油:1.4.0 PostgreSQL:12

【问题讨论】:

【参考方案1】:

无法从 WebAssembly 链接到系统库。您必须使用用纯 Rust 代码编写的实现才能使其工作。您还可以使用 javascript 库。但它总是必须在 JavaScript 运行时环境中。

【讨论】:

【参考方案2】:

libpq 在 postgreSQL 安装二进制文件中可用

例如PosgreSQL Binary Download Site如果打开压缩包postgresql-12.0-1-windows-x64-binaries.zip你可以看到这2个文件:

pgsql\lib\libpq.dll pgsql\lib\libpq.lib

您需要指定 LD_LIBRARY_PATH 或者您可以在编译器参数中指定 -L 来告诉文件夹路径将自动选择这些文件

如果您使用过安装程序,安装文件夹中应该有相同的文件

你也可以参考这个***链接How to I tell Rust where to look for a static library?

--编辑--

要在 Web assemble 发行版中组合 C 库,我们可以使用本指南 - Compiling an Existing C Module to WebAssembly

【讨论】:

不幸的是,这没有帮助。此外,通向 PostgreSQL 目录的 -L 选项从一开始就通过 PQ_LIB_DIR 存在,但 lld 继续失败。在某个地方,我看到libpq 也应该遵守 WASM 的想法;否则,链接器将无法找到它。可能,这是一个答案。 是的,如果你想运行一些浏览器,那么它需要作为静态库嵌入到 wasm 二进制分发中

以上是关于如何通过 wasm-pack 将 Rust Wasm 应用程序与 libpq 链接?的主要内容,如果未能解决你的问题,请参考以下文章

wasm-pack 代码中的 Rust 导入导致 JS 错误

rust语言编写wasm简单例子

rust语言编写wasm简单例子

rust语言编写wasm简单例子

aws amplify 不为 wasm 提供内容类型

如何将 C 字符串转换为 Rust 字符串并通过 FFI 转换回来?