遭遇した事象
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