C++
Xcode

Linker command failed with exit code 1でハマりまくったお話

More than 1 year has passed since last update.

Linker command failed with exit code 1

現在C++をベースにした openFrameworks というライブラリを用いて開発していますが、たまにこのエラーに遭遇します。
また、このエラー自体は swiftObjective-C を使った開発でも見かけたことがありますので、Xcodeのエラーだと思われます(ちなみに筆者のXcodeは 8.3.3 です)。

このエラーの辛いところ、それは”何がダメなのかよくわからないところ”です。

スクリーンショット 2017-09-10 15.09.30.png

というわけで、このエラーが出ると一気にやる気が失せてしまうわけですね。
エラー発生の理由がよくわからないので、何を修正したら良いのかもよくわからない。
どこの何行目がダメ、とか書かれていなくて、すごく困ったものです。

しかし、ようやくこのエラーとの向き合い方がわかった気がするので、今回備忘録として書いておくことにしました。

発生原因は別のところで見れる

さすがに上のようなメッセージだけでは何を直せばいいの?となり、途方にくれましたので、エラーが出た過程を見れないものかと試してみました。

スクリーンショット 2017-09-10 15.14.15.png

Linker command の部分を右クリックで画像のようなポップアップ画面を出します。
そして、この中の Reveal in Logをクリックすると、下のようにエラー原因を見ることができます。

スクリーンショット 2017-09-10 15.19.27.png

筆者の場合、上記のようなメッセージと、duplicate symbol というメッセージを発見。
このとき、筆者のプログラムではcppファイルで別クラスをincludeし、そのまま変数をcppで定義していました。
これを複数のクラスで行なっていたため、このようなエラーが出たということがわかりました。
なので、これらをhファイルで宣言することでエラーを解消できました。
duplicateは訳すと「複写」という意味を持つらしく、定義が重複している時などに現れる模様です。
このように、Reveral in Logでエラーの詳細を見ればLinker commandの原因も特定しやすくなります。

ちなみに、hファイルで定義したメソッドをcppファイルで記述していない時などにもLinker commandのエラーが出ます。
このとき、ログで表示されたメッセージはreferenced fromでした。

Linker commandで困ったら Reveal in Log を

まずはエラーの原因を特定するところから!ですね。
これができればエラー解消も楽になるのではないでしょうか。