如何在安装了Postgres工具的Docker中修复diesel_cli链接libpq.lib错误?

19

我已经尝试了好几个小时来安装用于Postgres的cargo crate diesel_cli。但是,每次我运行推荐的cargo命令时:

cargo install diesel_cli --no-default-features --features postgres

我等了几分钟,只是为了看到同样的构建失败并显示以下消息:

note: LINK : fatal error LNK1181: cannot open input file 'libpq.lib'

error: aborting due to previous error
error: failed to compile `diesel_cli v1.4.1`, intermediate artifacts can be found at `C:\Users\<user name here>\AppData\Local\Temp\cargo-installUU2DtT`

Caused by:
  could not compile `diesel_cli`.

我正在Docker容器中运行Postgres,在我的C:\pgsql上有二进制文件,同时libbin目录都在PATH上,所以我无法弄清楚为什么它没有链接。文档中没有提到需要什么其他内容,还需要什么?


你将它放在了你特定用户的 PATH 中还是放在了系统变量中的 PATH 中? - MindSwipe
@MindSwipe 它需要在哪里?我想我的目前是用户。 - CoderLee
8个回答

31

在我的情况下,安装成功了,但当我尝试运行它时出现了这个错误。 也许对于遇到同样问题的其他人来说,这可能有用:

  • 打开 PowerShell
  • 输入 setx PQ_LIB_DIR "C:\Program Files\PostgreSQL\13\lib" (或者你的 PostgreSQL lib 路径)
  • 重新启动电脑
  • 再次运行程序

我在使用 WSL 时也遇到了同样的问题,如果您在 Linux 上,您可能可以找到 PostgreSQL lib 位置,并将其添加到环境变量中。


1
卡在这里有一段时间了,除了 PG 数据库外,这个链接有适当的路径命令 https://steemit.com/programming/@mrblueberry/installing-rust-and-diesel-for-rocket-on-windows-10 - gt124
2
这对我有效。我不知道在哪里找到所提及的libpq.lib文件,但输入命令(或像我这样复制粘贴)更容易且可行。 - Eko Andri
在我的情况下,我还需要链接PostgreSQL的bin目录。 - Bourdier Jonathan
这对我有效。第一次尝试时,我使用了PowerShell的自动完成功能,它会自动在文件末尾添加一个斜杠“\”。这是不行的。重要的是在上述命令的末尾没有斜杠。 - Marco

21

更新:

下面的答案是针对较旧版本的解决方法。请先尝试执行cargo clean,看是否有可能解决问题。


翻译版本:

将文件夹添加到PATH变量中并没有帮助,至少在我的情况下是这样,因为某种原因它不会在传递给link.exe/LIBPATH参数中使用。 在我的情况下,它是C:\Users\<username>\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib 你可以在错误消息的开头看到它。 将libpq.lib复制到该位置,然后它将从那里使用。

安装diesel后还需要一些其他程序集。将libcrypto-1_1-x64.dlllibiconv-2.dlllibssl-1_1-x64.dll复制到执行where diesel命令后显示的文件夹中。


2
这不应该被视为已接受的答案,因为正如下面@Balen在一个答案中提到的那样,它只是一个解决方法,正确的答案实际上是将lib路径添加到PATH环境变量中,并且如果你仍然遇到问题,首先使用cargo clean来获得正确的结果。 - sikkiv

9

我在Ubuntu上也遇到了同样的错误,对我来说以下安装解决了这个问题:

sudo apt install libpq-dev

这在我的Ubuntu 22.04和Postgres 14.6上有效。libpq-dev似乎是Postgres的二进制文件和头文件。https://pypi.org/project/libpq-dev/ https://launchpad.net/ubuntu/jammy/+package/libpq-dev - onx2

7
无需移动文件,只需将C:\Program Files\PostgreSQL\14\libC:\Program Files\PostgreSQL\14\bin添加到您的PATH中。安装和运行diesel应该没有问题。
注意:您的路径可能不同,并记得关闭/重新打开终端以更新PATH变量。
(在Windows 10上测试通过)

已在 Windows 11 上进行测试,第 15 页。 - Shaddy Mansour
这对我在Windows 10上起作用 - 在更新环境变量后,我必须打开一个新的PowerShell窗口。 - Daniel
这在我的Windows 10上有效,第14页。 - undefined

5
你可以将路径添加到编译器的库搜索路径中,使用 RUSTFLAGS 环境变量。这适用于安装 diesel_cli 和构建你的项目。请注意保留 HTML 标签。
RUSTFLAGS='-L /usr/local/pgsql/lib' cargo build

在使用EDB安装程序的Windows系统中,路径包含空格,因此请改用CARGO_ENCODED_RUSTFLAGS。对于PowerShell:
$env:CARGO_ENCODED_RUSTFLAGS = "-L`u{1f}C:\Program Files\PostgreSQL\14\lib"

有没有办法在Windows命令提示符中插入0x1f特殊字符(而不是使用Powershell)? - Miscreant
1
在Mac OS(Ventura)上,使用RUSTFLAGS="-L /usr/local/opt/libpq/lib" cargo test [package]解决了我的问题! - BanjoFox

4

如果您在环境无效的情况下尝试进行cargo build(或运行libpq rust crate的构建脚本),那么在修复环境后,您需要执行cargo clean,否则即使libpq.lib在您的PATH中,您仍将收到libpq.lib未找到的错误。将文件复制到另一个目录的其他答案只是hack。


3
为了在Windows上提供明确的步骤:
  1. 在环境变量中添加C:\Users\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib路径。

  2. 复制位于C:\Program Files\PostgreSQL\14\lib(显然这是版本14)中的libpq.lib,并将其粘贴到C:\Users\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib中。


2
这是我在我的情况下需要做的事情:
编辑 $HOME/.cargo/config.toml:
[target.x86_64-pc-windows-msvc.pq]
rustc-link-search = ["C:\\Program Files\\PostgreSQL\\13\\lib"]
rustc-link-lib = ["libpq"]

确保将rustc-link-search替换为包含libpq.lib文件的路径。

1
如果文件不存在,则创建一个文件。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接