error installing psycopg2, library not found for -lssl
For anyone looking for a solution for this on macOS Sierra 10.12 (or later, most likely): I fixed this by installing the command line tools:
xcode-select --install
After that, pip install psycopg2
should work.
If it doesn't, you could also try to link against brew's openssl:
env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip install psycopg2
with openssl installed via brew. Note that the brew link openssl --force
does not work anymore:
$ brew link openssl --force 17.5sWarning: Refusing to link: opensslLinking 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
As @macho points out below if this still does not work, you might need to use the --no-cache
option of pip, e.g.
env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pip --no-cache install psycopg2
Remember to adjust these paths accordingly should you for instance build on ARM/Apple M1 Macs (as homebrew is installed at /opt/homebrew/
); command as follows:
env LDFLAGS="-I/opt/homebrew/opt/openssl/include -L/opt/homebrew/opt/openssl/lib" pip --no-cache install psycopg2
I had OpenSSL installed from brew (brew install openssl
)
The following worked for me:
export LDFLAGS="-L/usr/local/opt/openssl/lib"export CPPFLAGS="-I/usr/local/opt/openssl/include"pip install psycopg2
Using brew link openssl
is dangerous as it might mess up your system by symlinking Homebrew's OpenSSL headers while the actual libraries will remain the system-supplied ones, causing all kinds of issues. Homebrew actually warns you against this if you try (and other answers suggest linking won't solve the problem anymore anyway):
$ brew link opensslWarning: Refusing to link: opensslLinking 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
Following this advice here's the pip
command you need to use:
$ 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"
For pipenv
, I am not aware of any command-line attributes you can pass to it, however you can export the aforementioned paths as environment variables prior to running pipenv install
:
$ export LDFLAGS="-L/usr/local/opt/openssl/lib" export CPPFLAGS="-I/usr/local/opt/openssl/include"$ pipenv install