El Capitanでソースをコンパイルしたときにopensslのエラーが出た場合の対処方法


遭遇した事象

libimobiledeviceをソースからコンパイルしようとしたところ、以下のエラーが出て失敗しました。

コマンド
$ ./configure
# 省略
Configuration for libimobiledevice 1.2.0:
-------------------------------------------

  Install prefix: .........: /usr/local
  Debug code ..............: no
  Python bindings .........: no
  SSL support backend .....: OpenSSL

  Now type 'make' to build libimobiledevice 1.2.0,
  and then 'make install' for installation.

$ make
/Applications/Xcode.app/Contents/Developer/usr/bin/make  all-recursive
Making all in common
  CC       socket.lo
  CC       thread.lo
  CC       debug.lo
In file included from debug.c:36:
../src/idevice.h:30:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make[2]: *** [debug.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

ssl.hを見つけられていないようです。
ネットを調べて回ったところ、以下の情報が見つかりました。

  • El CapitanではOpenSSLヘッダが提供されなくなっている
  • Homebrewでopensslをインストールし、brew link openssl --forceのコマンドを実行すると良い

opensslはHomebrewで最新のものをインストール済みの環境でした。
brew link 〜のコマンドを実行しても、残念ながらエラーは変わりません。

解決策

.bash_profile に以下のパスを追加したところ、コンパイルが通るようになりました。

.bash_profile
export PATH=/usr/local/opt/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$LD_LIBRARY_PATH
export CPATH=/usr/local/opt/openssl/include:$CPATH
export LDFLAGS=-L/usr/local/opt/openssl/lib
export CPPFLAGS=-I/usr/local/opt/openssl/include
export PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH

なお、パスを追加していても、brew link openssl --forceを実行していない環境では、以下のエラーが発生してコンパイルに失敗しました。

コマンド
$ make
# 省略
Undefined symbols for architecture x86_64:
  "_ERR_remove_thread_state", referenced from:
      _internal_idevice_deinit in idevice.o
      _idevice_connection_enable_ssl in idevice.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libimobiledevice.la] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

brew link 〜の実行とパスの追加の両方が必要だったようです。

brew link openssl --forceは、現在は使えなくなっています。

コマンド
$ brew link openssl --force
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

環境

  • Mac OS X 10.11.6 El Capitan
  • MacBook Pro (Retina, 13-inch, Late 2013)
  • Xcode 8.2.1
  • Homebrew 1.2.0 (git revision 922c8; last commit 2017-05-02)
  • OpenSSL 1.0.2k 26 Jan 2017
  • libimobiledevice-1.2.0