Xcodeでコンパイルエラーが出たときの調べ方
iPhone向けのメーラーを作ってみようと思い、LibEtPan というライブラリをGitHubから
ダウンロードして、以下のURLにある pop-sample.c のサンプルコードを使ってみたところ
エラーが出ました。
結論からいうとエラーメッセージをそのままネットで調べて、とりあえずコンパイルエラーは
発生しなくなり、無事、ライブラリを使う事はできたのですが、なぜ動くようになったのか、
今のコンパイルエラーが出ていない状態がはたして正しいのかがわかっておりません。
以下、エラー発生までのプロセスです。
1、新規でiPhone向けプロジェクトを作成
2、libEtPanをサブプロジェクトとして追加
3、libetpan-ios.a をLinkに追加
4、Other Linker Flagsに -lsasl2 を設定
5、pop-sample.cのサンプルコードをコピー
(サンプルコード内にあるファイル書き込みの処理はコンソールにメール内容を表示する処理に置き換えた)
手順3と4は以下GitHubのREADMEに書いてある手順です。
https://github.com/dinhviethoa/libetpan
この状態でビルドすると、以下のようなエラーが発生しました。
Undefined symbols for architecture i386:
"_SecCertificateCopyData", referenced from:
_mailstream_low_cfstream_get_certificate_chain in libetpan-ios.a(mailstream_cfstream.o)
"_deflate", referenced from:
_mailstream_low_compress_write in libetpan-ios.a(mailstream_compress.o)
"_deflateEnd", referenced from:
_mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o)
_mailstream_low_compress_free in libetpan-ios.a(mailstream_compress.o)
"_deflateInit2_", referenced from:
_mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o)
"_inflate", referenced from:
_mailstream_low_compress_read in libetpan-ios.a(mailstream_compress.o)
"_inflateEnd", referenced from:
_mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o)
_mailstream_low_compress_free in libetpan-ios.a(mailstream_compress.o)
"_inflateInit2_", referenced from:
_mailstream_low_compress_open in libetpan-ios.a(mailstream_compress.o)
"_kCFStreamPropertySSLPeerCertificates", referenced from:
_mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o)
_mailstream_low_cfstream_get_certificate_chain in libetpan-ios.a(mailstream_cfstream.o)
"_kCFStreamPropertySSLSettings", referenced from:
_mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o)
"_kCFStreamSSLAllowsAnyRoot", referenced from:
_mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o)
"_kCFStreamSSLAllowsExpiredCertificates", referenced from:
_mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o)
"_kCFStreamSSLAllowsExpiredRoots", referenced from:
_mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o)
"_kCFStreamSSLLevel", referenced from:
_mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o)
"_kCFStreamSSLValidatesCertificateChain", referenced from:
_mailstream_cfstream_set_ssl_enabled in libetpan-ios.a(mailstream_cfstream.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
そこで、上記のエラーメッセージをネットで検索し、結果的には以下のことをすることで、コンパイルエラーが
解消しました。
・CFNetwork.framework と Security.framework のLink追加
・Other Linker Flags に -lz の追加
そこで、質問ですが、熟練したプログラマは、上記のようなエラーが出たとき、
そのエラーメッセージからどういう情報を読み取り、どのようなプロセスで問題を
解決するのでしょうか?
私は、上記のエラーメッセージを見ても「Undefined symbols」というメッセージから
何かライブラリが足りないのかな?程度しか情報を読み取る事ができませんでした。
以上、よろしくお願いします。