Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

遭遇した事象

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
marumaru
コードを書きサーバを立てるRuby好きのテストエンジニア。 Rustを本格的に学びたい今日この頃ですが最近の実務ではなぜかSwiftとシェーダーばかり書いています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away