【问题标题】:error installing psycopg2, library not found for -lssl安装 psycopg2 时出错,找不到 -lssl 的库
【发布时间】:2014-12-04 22:50:22
【问题描述】:

我跑

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

运行 easy_install从源代码 都在最后给我同样的错误(关于库的部分未找到 -lssl)。


运行 brew install(或升级)openssl 会产生以下结果

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

谁能帮帮我?

【问题讨论】:

标签: python postgresql psycopg2


【解决方案1】:

对于在 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

【讨论】:

  • 其实xcode-select --install可能就够了,这个应该使用系统提供的ssl。我会在上面更新我的评论。
  • xcode-select install 对于系统python来说已经足够好了。但它不适用于虚拟环境。
  • xcode-select --install 为我解决了 Sierra 上的问题,也适用于虚拟环境
  • xcode-select --install 对我不起作用。我已经安装了命令行工具。但是,env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install psycopg2 仍然有效。
  • 您可能需要使用 pip 的 --no-cache 选项。例如env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip --no-cache install psycopg2
【解决方案2】:

我从 brew (brew install openssl) 安装了 OpenSSL

以下内容对我有用:

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

【讨论】:

  • 我已经安装了 xcode 工具,但这也对我有用!
  • 这在 Catalina 上使用虚拟环境对我有用。其他答案对我不起作用,因为 xcode-select 已经安装,openssl 是一个不错的版本,设置 LD_LIBRARY_FLAG 没有效果。
  • 如果您在 Apple Silicon 上并通过自制软件安装了 openssl,您的路径将有所不同。你可以通过brew --prefix openssl找到openssl的安装位置。
  • 我有一个大型 pip 安装过程,其中包含 psycopg2。这是能够使安装过程正常工作的唯一答案。
  • 这对我有用,但我在 M1 Mac 上,因此必须使用通过 home-brew 安装的 openssl 相应地设置环境变量。 ``` 出口 LDFLAGS="-L/opt/homebrew/Cellar/openssl@1.1/1.1.1k/lib/" 出口 CPPFLAGS="-I/opt/homebrew/Cellar/openssl@1.1/1.1.1k/include" ```
【解决方案3】:

使用brew link openssl 是危险的,因为它可能会通过符号链接 Homebrew 的 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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 也曾在 Mojave 上工作过。谢谢!
    • 你节省了我的时间。
    • 该死的我全心全意地爱你
    【解决方案5】:

    对我有用的是命令中提供的链接 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
    

    【讨论】:

    • 大多数人可能不使用 zsh 但无论如何,我只是运行 echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc 和这足以解决问题而无需更改 LDFLAGS 和 CPPFLAGS 环境变量
    【解决方案6】:

    在 mojave 上,我将这些添加到 .bash_profile

    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 和命令行工具后。

    以上所有答案都有帮助!

    【讨论】:

      【解决方案7】:

      这是新macOS版本的问题,pip无法安装cryptography。解决我的问题是为安装命令提供环境:

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

      您可以将&lt;YOUR COMMAND HERE&gt; 替换为pip install cryptography,例如pip install &lt;SOMETHING THAT REQUIRES cryptography&gt;

      感谢这篇文章:Fixing macOS Sierra fatal error: 'openssl/opensslv.h' or 'openssl/aes.h' file not found

      【讨论】:

        【解决方案8】:

        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"
        

        这对我有用!无法保证这也适用于您。

        brew reinstall 可能不是最好的解决方案,但它有效并提供了必要的命令。

        【讨论】:

          【解决方案9】:

          使用 Fish,以下两个命令在使用 Homebrew 安装 OpenSSL 后为我解决了这个问题。

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

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

          【讨论】:

            【解决方案10】:

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

            为我工作

            【讨论】:

              【解决方案11】:

              如果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

              【讨论】:

                【解决方案12】:

                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
                

                【讨论】:

                  【解决方案13】:

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

                  解决方案是使用更高版本的 psycopg2。 2.7.7 版有效,而 2.7.1 版则没有。

                  【讨论】:

                    【解决方案14】:

                    安装psycopg2-binary,而不是安装psycopg2,来自同一作者:

                    pip install psycopg2-binary
                    

                    这就是文档对这个 PyPI 包的描述:

                    您可以[...]通过从 PyPI 安装 psycopg2-binary 包来获得独立包,不需要编译器或外部库:

                    $ pip install psycopg2-binary
                    

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

                    【讨论】:

                      【解决方案15】:

                      我使用 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
                      

                      【讨论】:

                        【解决方案16】:

                        如果你:

                        • 正在尝试在 Python venv 中安装 psycopg2 并且
                        • 正在尝试在 Apple Silicon(新 ARM CPU)上安装 psycopg2

                        然后,正如 Iamashay 在 their answer 中所指示的,我们需要导出一些变量以指向我们的 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
                        

                        【讨论】:

                          【解决方案17】:

                          如果使用自制软件,强制链接 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
                          

                          【讨论】:

                            【解决方案18】:

                            我在 Mojave 遇到了这个问题。 Mojave 不会创建 psycopg2 需要安装的 /usr/include 目录。这并不明显。我在这里找到了解决方案: How to update Xcode from command line,其中引用: https://forums.developer.apple.com/thread/104296

                            【讨论】:

                            • 进一步说明:我安装了 Xcode 和命令行工具。 xcode-select --install 命令显示我已经安装了它们,xcode-select -p 和 echo $?返回一个 0,这也表明它们已安装。我正在使用 pyenv 和 pyenv-virtualenv,所以我将 psycopg2 安装到虚拟环境中。
                            【解决方案19】:

                            我遇到了同样的错误,并在我 pip 安装了 cython 后解决了它

                            【讨论】:

                              【解决方案20】:

                              从 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
                              
                              '''
                              
                              
                              

                              【讨论】:

                                【解决方案21】:

                                我知道您要的是开发环境,但如果您要在服务器上部署,请说 Heroku。只需在项目的 requirements.txt 中添加以下行。

                                django-heroku==0.3.1

                                因为这个包本身会在服务器部署上安装所需的包,如 psycopg2。所以让 heroku 服务器来处理。

                                【讨论】:

                                  【解决方案22】:

                                  就我而言,openssl 位于 homebrew 目录中,建议的答案不起作用。

                                  不好:

                                  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)

                                  【讨论】:

                                    【解决方案23】:

                                    我在这里尝试了大多数其他答案,但没有成功。唯一对我有用的是从 psycopg2 从 2.8 更新到 2.9.2(使用 Apple M1 运行 MacOS 12)

                                    【讨论】:

                                      【解决方案24】:

                                      尝试了此处列出的所有内容,然后将 shell 从 zsh 切换到 bash,然后它工作了。

                                      【讨论】:

                                        【解决方案25】:

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

                                        brew unlink openssl && brew link openssl --force
                                        

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

                                        【讨论】:

                                          猜你喜欢
                                          • 2017-03-28
                                          • 2022-09-23
                                          • 2019-01-13
                                          • 2019-11-24
                                          • 2014-11-16
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2019-06-11
                                          相关资源
                                          最近更新 更多