Date: 2015/8/21 Cate: C++, cocos2d-x Tags:  

cocos2d-xでゲームを開発しているのですが、GooglePlayGamesというGoogleが出してる便利なやつがありまして。
まぁ色々機能があるんですが、これをcocos2d-xで使うと、実機でのビルドはうまくいくのですがシミュレーターで動かそうとするとduplicate symbol _OPENSSL_cleanseみたいなエラーがでることがありました。

duplicate symbol _OPENSSL_cleanse in:
    /Users/keishake/Documents/Test/proj.ios_mac/Pods/GooglePlayGames/gpg-cpp-sdk/ios/gpg.framework/gpg(mem_clr.o)
    /Users/keishake/Library/Developer/Xcode/DerivedData/Test-deqimedhwswrupezajczlzzbdeud/Build/Products/Debug-iphonesimulator/libcocos2d iOS.a(x86cpuid.o)
ld: 1 duplicate symbol for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

↑こんなかんじのエラーです。

cocos2d-xとGooglePlayGamesを使うと必ずこのエラーが起きる、というわけではなく、#include <curl/curl.h>みたいにlibcurlを使っているときにエラーが起きるようです。(あとSocketIO.hとかをincludeしても、内部でcurl使ってるのでエラー起きます)

gpg(GooglePlayGames)の中に含まれるmem_clr.oと、libcocos2d iOS.aの中に含まれるx86cpuid.oの両方でOPENSSL_cleanseが定義されている、みたいなかんじですかね。

どうにかならないか色々調べてみて、lipoコマンドでgpgからシミュレーター向けのi384x86_64を分けて、mem_clr.oを削除してみたらいいのかな〜とかもやってみたんですが、どうもうまくいかなくてかなりハマってしまいました・・・。
で、調べまくっていたら、別件のエラーではありますが、こちらのブログ(duplicate symbol _SHA1エラー)でAppliPromotionのSDKをいれると似たようなエラーがでる、というのを見つけました。

Other Linker Flagsに-force_load $(SRCROOT)/../cocos2d/external/curl/prebuilt/ios/libcurl.aを追加する

上記ブログでは対応策として、Other Linker Flagsで-force_loadしてみるととりあえず動いた、とのことだったので、まねして$(SRCROOT)/../cocos2d/external/curl/prebuilt/ios/libcurl.aというようにlibcurl.aをforce loadするようにしてみたところ、シミュレーターでビルドが通りました!

↑こんなかんじで指定します。

ProjectのBuild SettingsのOther Linker Flagsに、-force_load $(SRCROOT)/../cocos2d/external/curl/prebuilt/ios/libcurl.aを追加する形です。

シミュレーターでざっと動作を確認したところ、今のところ問題なく動いています。

かなりハマった問題だったので、ひとまずホッとしました・・・。

Leave a Reply