【Xcode】【iOS】ライブラリ導入時のApple Mach-O Linker Error. library not found for -lcurl【謎のエラー?】

  • 132
    Like
  • 1
    Comment
More than 1 year has passed since last update.

Build Failed

開発業務を行っていると各種ライブラリを使用したりすることがあると思います。
その時にビルドエラーが起きる事があります。
もちろん原因はいくつも考えられます。
・必要なフレームワークが足りない?
・ビルドセッティングがおかしい?
などなど。
こういったものは公式サイトのドキュメントをしっかりと読んだり、
セッティングなどを見なおしたり、またウェブ検索を駆使し。
先人の知恵をお借りしたりすれば大抵解決出来る事でしょう。

しかし、
・必要なフレームワークはちゃんと入れてる
・ビルドセッティングもおかしくは無い…はず
だけどビルドエラー…。

なんてこともあります。
その時の解決策は状況によってまちまちですが、
その一つだけ再現例を交えて紹介します。

今回のサンプルで使用したのはFlurry

サンプルプロジェクト作成

テキトーにxcode開いて、テキトーにサンプルプロジェクトを作りました。

スクリーンショット 2014-02-23 15.56.07.png

何にも考えずにライブラリを入れてビルドしてみる

そのサンプルプロジェクトにFlurryのライブラリを入れて、ビルド。

スクリーンショット 2014-02-23 15.58.06.png

はい、もちろんエラー出ました。
必要なFrameworkが無いからです。

スクリーンショット 2014-02-23 16.00.05.png

公式でもウェブ検索でも、この2つのframeworkが必要ですよーという情報が溢れています。
この2つのFrameworkを入れてビルドすれば、OKです。

え…まだビルドエラー…だと…?

こっからが本題です。
必要なフレームワーク入れたのにビルドエラー!

※わざと引き起こしています。基本的には発生しません。
スクリーンショット 2014-02-23 16.02.22.png

あまり見たくない画面ですね。

ですが、正直これは分かりやすい部類です。
他のライブラリ入れて無いんで、library not found for -lFlurry_4.3.2
とかちゃんと言ってます。

しかし、他のライブラリも入っていると

ld: library not found for -lluasocket
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ld: library not found for -lcurl
clang: error: linker command failed with exit code 1 (use -v to see invocation)

などなど
全然関係はずのライブラリが無い!といった謎のエラーになることがあります。

調査状況例

その場合多くの方が
・必要なフレームワークが入ってないんじゃないか?
・ビルドセッティングがおかしいのか?
・必要ないライブラリファイルまで入れちゃった?
・いやいや、本当にそのライブラリが無いんじゃないの?
などと考えを巡らしながら、解決策を図るはずです。

で、調査していくとこんな状況になったり。
1) Flurryを入れる直前のxcodeprojをビルド => Success
2) Security.frameworkだけ入れてビルド => Success
3) SystemConfiguration.frameworkも入れてビルド => Success
4) Flurryフォルダを入れてビルド => FAIL

解決

この一連のビルドエラーの原因はズバリこれです。

スクリーンショット 2014-02-23 16.03.01.png

一見、パス合ってますんで、そこまでおかしくない気がします。
が、この\"が曲者です。それを除去したら無事にビルドが通るようになります。

実プロジェクトっぽくしますと、
$(inherited)
\"$(SRCROOT)/libraryA/Plugins\"
\"$(SRCROOT)/libraryB\"
/Users/aaaa/Documents/libraryC

から

$(inherited)
$(SRCROOT)/libraryA/Plugins
$(SRCROOT)/libraryB
/Users/aaaa/Documents/libraryC

このようにすると無事にビルドエラーが解消されます。
逆に

$(inherited)
\"$(SRCROOT)/libraryA/Plugins\"
\"$(SRCROOT)/libraryB\"
\"/Users/aaaa/Documents/libraryC\"

これではビルドエラーは解消されません。

その他

フタを開けてみればなんてことはない事でさらにTIPSレベルで恐縮です。
そして例外なので、そうそう直面することが無いエラーです。

ソースコードの記述ミスレベルならともかく
リンカエラー系なんて誰も見たくないで、直面しなければしない方がいいです。

・Xcode4以前から開発が続いているプロジェクトでなおかつ各種ライブラリを使用している
(相対パスでしっかりと指定していて、多人数開発にも対応させている)

プロジェクトでは発生する可能性があります。

過去にあった事を思い出しながらこの記事を書いたので、
少し状況が曖昧ですが、解決策は間違いありません。

もし、誰かがそのような状況に置かれた時にこのTIPSが役に立つ事を祈っています。