安装psycopg2时出错,找不到-lssl的库

我跑步

sudo pip install psycopg2

我得到了一系列输出,如下所示:

cc -DNDEBUG -g -fwrapv -Os .....
.....
cc -DNDEBUG -g -fwrapv -Os .....
.....

最后它说:

ld: library not found for -lssl


clang: error: linker command failed with exit code 1 (use -v to see invocation)


error: command 'cc' failed with exit status 1


----------------------------------------
Cleaning up...
Command /usr/bin/python -c "import setuptools, tokenize;__file__='/private/var/folders/bz/pvj1g9xj16d10pjjgbrfl3fw0000gn/T/pip_build_root/psycopg2/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/bz/pvj1g9xj16d10pjjgbrfl3fw0000gn/T/pip-uE3thn-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /private/var/folders/bz/pvj1g9xj16d10pjjgbrfl3fw0000gn/T/pip_build_root/psycopg2
Storing debug log for failure in /Users/Tyler/Library/Logs/pip.log

运行_安装简单从源头都在最后给我相同的错误(关于未找到-lssl的库的部分)。


运行BREW安装(或升级)OpenSSL会产生以下结果

$ brew upgrade openssl
Error: openssl-1.0.1h already installed

有人能帮我吗?

58017 次浏览

我已经设法通过使用来修复它:

brew unlink openssl && brew link openssl --force

我不确定这与我之前在OpenSSL上尝试的BREW卸载/升级有何不同。我的假设是,这些操作留下了一些“错误的”共享库,这些共享库阻止了它的工作。请注意,这也修复了安装Python加密模块的问题。

对于任何在MacOS Sierra 10.12(或更高版本,最有可能)上寻找解决方案的人:我通过安装命令行工具解决了这个问题:

xcode-select --install

之后,pip install psycopg2应该起作用。

如果没有,您也可以尝试链接BREW的OpenSSL:

env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install psycopg2

通过BREW安装OpenSSL.请注意,brew link openssl --force不再起作用:

$ brew link openssl --force                                                                                 17.5s
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib

正如@macho在下面指出的那样,如果这仍然不起作用,您可能需要使用PIP的--no-cache选项,例如

env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip --no-cache install psycopg2

记住要相应地调整这些路径,例如,如果您在ARM/Apple M1 Mac上构建(因为自制程序安装在/opt/homebrew/)。命令如下:

env LDFLAGS="-I/opt/homebrew/opt/openssl/include -L/opt/homebrew/opt/openssl/lib" pip --no-cache install psycopg2

使用brew link openssl是危险的,因为它可能会通过符号链接自制程序的OpenSSL头文件来搞乱您的系统,而实际的库仍然是系统提供的库,从而导致各种问题。如果你尝试的话,Homebrew实际上会警告你不要这样做(其他答案表明链接无论如何都不会解决问题):

$ brew link openssl
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib

以下是您需要使用的pip命令:

$ pip install -r requirements.txt --global-option=build_ext --global-option="-I/usr/local/opt/openssl/include" --global-option="-L/usr/local/opt/openssl/lib"

对于pipenv,我不知道您可以传递给它的任何命令行属性,但是您可以在运行pipenv install之前将上述路径导出为环境变量:

$ export LDFLAGS="-L/usr/local/opt/openssl/lib" export CPPFLAGS="-I/usr/local/opt/openssl/include"
$ pipenv install

最近在High Sierra中遇到了这个问题,因为我刚刚在VirtualEnv中安装了Python 3.7。

解决方案是使用更高版本的PsycopG2。版本2.7.7可以工作,而2.7.1不能。

对我有用的是命令中提供的链接OpenSSL的提示,

$ brew link openssl
Warning: Refusing to link macOS-provided software: openssl
If you need to have openssl first in your PATH run:
echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc


For compilers to find openssl you may need to set:
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"


$ export LDFLAGS="-L/usr/local/opt/openssl/lib"
$ export CPPFLAGS="-I/usr/local/opt/openssl/include"


$ pip install psycopg2
Collecting psycopg2
Using cached https://files.pythonhosted.org/packages/23/7e/93c325482c328619870b6cd09370f6dbe1148283daca65115cd63642e60f/psycopg2-2.8.2.tar.gz
Installing collected packages: psycopg2
Running setup.py install for psycopg2 ... done
Successfully installed psycopg2-2.8.2

如果您从BREW安装了OpenSSL(brew install openssl

以下工程:

export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
pip install psycopg2

不安装psycopg2,而是安装psycopg2-binary,作者与您相同:

pip install psycopg2-binary

关于这个PyPI包的文档是这样说的:

你可以[..]获得一个独立的软件包,不需要编译器或外部库,通过从PyPi安装psycopg2-二进制包:

$ pip install psycopg2-binary

二进制包是开发和测试的实用选择,但在生产中,建议使用从源代码构建的包。

在Mojave上,我将它们添加到.bash_配置文件中。

export PATH="/usr/local/opt/openssl/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/curl/lib -L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/curl/include -I/user/local/opt/openssl/include"

然后能够在Python 3.7.4 VirtualEnv中安装Psycopg 2.8.3。

这是在重新安装Xcode和命令行工具之后。

上面所有的答案都很有帮助!

在使用自制软件安装OpenSSL后,使用fish,以下两个命令为我解决了这个问题。

set -gx LDFLAGS "-L/usr/local/opt/openssl/lib"
set -gx CPPFLAGS "-I/usr/local/opt/openssl/include"

使用brew info openssl获取最新信息。

我在莫哈韦沙漠遇到了这个问题。Mojave不创建/usr/include目录,而psycopg2需要安装该目录。这一点并不明显。我在这里找到了解决方案: 如何从命令行更新Xcode,它引用: https://forums.developer.apple.com/thread/104296

这是新MacOS版本的问题,PIP无法安装cryptography。解决我的问题的方法是为安装命令提供env:

brew install openssl
env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" <YOUR COMMAND HERE>

例如,您可以将<YOUR COMMAND HERE>替换为pip install cryptographypip install <SOMETHING THAT REQUIRES cryptography>

本文的出处:修复MacOS Sierra致命错误:找不到“ OpenSSL/opensslv.H ”或“ OpenSSL/AES.H ”文件

我有同样的错误,并在我安装了Cython后解决了它。

从Conda环境运行PyCharm,解决了我的问题,使用:

--> conda install psycopg2
The following packages will be UPDATED: ...


...
Proceed ([y]/n)?
--> y
--> pip3 install psycopg2
Installing collected packages: psycopg2
Running setup.py install for psycopg2 ... done
Successfully installed psycopg2-2.8.4


'''




我使用MacPorts安装了OpenSSL,因此目录与BREW的目录不同。

sudo port install openssl

我通过以下操作找到了目录:

port contents openssl | grep lib
port contents openssl | grep include

然后我导出了变量:

export LDFLAGS="-L/opt/local/lib"
export CPPFLAGS="-I/opt/local/include/openssl"

您可能还需要:

xcode-select --install

对于MacOS Catalina 10.15.4,以下是唯一对我有用的命令:

env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install psycopg2

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/

为我工作

如果export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl/lib/命令没有为您更改任何内容,则您可能还需要在此路径中指定openssl版本,如

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl@1.1/lib/

注意openssl之后的@1.1

尝试了这里列出的所有内容,然后将shell从zsh切换到bash,然后它成功了。

我知道你要求开发环境,但如果你在服务器上部署,比如说Heroku.只需在项目的要求.txt中添加下面一行。

Django-Heroku==0.3.1

因为此软件包本身将在Server Deployment上安装所需的软件包,如PSYCOPG2。所以让Heroku服务器来处理这个。

如果您:

  • 正在尝试将psycopg2安装到Pythonvenv中,并且
  • 正在尝试在Apple Silicon(新的ARM CPU)上安装psycopg2

然后,按照IAmashay在他们的回答中的指示,我们需要导出一些变量以指向我们的OpenSSL安装。

Apple Silicon上的安装目录明显不同于Apple Intel机器。无论如何,要找到OpenSSL在系统上的安装位置(通过自制程序),您可以运行

brew --prefix openssl

在我的例子中,我们有/opt/homebrew/opt/openssl@1.1。这意味着我们需要导出的变量是

export LDFLAGS="-L/opt/homebrew/opt/openssl/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl/include"

然后我们就可以跑了。

pip install psycopg2

在我的例子中,OpenSSL位于内部自制目录,建议的答案不起作用。

坏的:

LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib"

良好:

LDFLAGS="-I/opt/homebrew/Cellar/openssl@1.1/1.1.1i/include -L/opt/homebrew/Cellar/openssl@1.1/1.1.1i/lib" pip install psycopg2

提示:

您可以使用brew --prefix openssl轻松找到自制软件的OpenSSL目录。确保包括版本文件夹(在我的例子中是1.1.1i)

如果使用自制软件,强制链接OpenSSL可能不是最好的主意。正如上面的一些回答所概述的,以下内容在VENV中对我有用:

export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"
pip install psycopg2

MacOS BigSur解决方案(2021年5月)

我也有类似的问题。 但就在把我的电脑踢出桌面之前,我找到了一个解决方案,它在MacOS BigSur上对我很有效:

我的OpenSSL安装已损坏。

brew reinstall openssl

重新安装完成后,它将吐出需要执行的3个命令:

这些命令将如下所示:

不要只是抄袭

echo 'export PATH="/opt/homebrew/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc


export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"

这对我很有效!不能保证这对你也有用。

_,ABC_0可能不是最好的解决方案,但它可以工作并提供必要的命令。

MacOS 12 Monterey-M1芯片组解决方案:

xcode-select --install
brew install openssl
echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zshrc
echo 'export LIBRARY_PATH=$LIBRARY_PATH:/opt/homebrew/opt/openssl@3/lib/' >> ~/.zshrc

我在这里尝试了大多数其他答案,但都没有成功。唯一对我有用的是从PsycopG2从2.8升级到2.9.2(在苹果M1上运行MacOS 12)