背景#
最近MapManager
SDK を統合し、いくつかの問題に直面したのでここに記録します:
問題一:
接続ドキュメントで示された GMObjC アルゴリズム SDK のインポート方法は以下の通りですが、インポート後にコンパイルが通らず、次のエラーが表示されます:"sm2_plaintext_size" Too many arguments to function call, expected 3, have 4
pod 'GMObjC','3.0.0'
問題二:
MapManager
をインポートした後、QMUI ライブラリや他のサードパーティライブラリが元々正常だったのに、今はエラーが出てコンパイルが通らなくなりました。
問題三:
上記の問題がすべて解決され、コンパイルが成功したものの、起動するとクラッシュします。
解決:#
問題一"sm2_plaintext_size" Too many arguments to function call, expected 3, have 4
の解決は非常に簡単で、pod 'GMObjC'
に変更し、最新バージョンをインストールすれば良いです。
問題二を確認したところ、エラーが発生している箇所はプロパティやメソッド内で debug または release で定義された変数を使用していました。しかし、なぜ以前は問題がなかったのに、MapManager
SDK をインポートした後にエラーが出たのでしょうか?詳しく調査した結果、MapManager
SDK のMapService.h
クラスに以下のコードがありました:
#define debug @"debug"
#define release @"release"
定義されたマクロにプレフィックスがないため、プロジェクト内の他の debug または release を使用している箇所でエラーが発生します。したがって、ここを以下のコードに変更すれば解決できます。Ps:サードパーティ SDK をラップする際には、定義したマクロを外部で使用する必要がある場合は必ず処理を行うべきです。
#define kDebugStr @"debug"
#define kReleaseStr @"release"
最後に、問題三ですが、上記の問題がすべて解決され、コンパイルが成功したものの、実行するとクラッシュし、メモリリークの警告が表示されます。しばらく調査した結果、最初は何か依存ライブラリがインポートされていないのかと思いましたが、チュートリアルと比較してもサードパーティライブラリが不足しているわけではありませんでした。その後、MapManager
に問題があるのではないかと思い、MapManager
を削除し、GMObjC
だけを残したところ、やはり実行するとクラッシュしました。そこでGMObjC
のGithubを確認したところ、次のような記述がありました:
GMObjC は OpenSSL 1.1.1 以上に依存しています。CocoaPods は同じ静的ライブラリの異なるバージョンをサポートしていません。サードパーティライブラリとの OpenSSL の競合が発生した場合、例えば、Baidu MapKit がより低いバージョンの OpenSSL 静的ライブラリに依存している場合、依存関係の競合が発生します。
つまり、GMObjC
は OpenSSL に依存しており、他のサードパーティ SDK も依存している可能性があり、競合が発生することがあります。例えば:百度地図 SDK。ちょうど私のプロジェクトには百度地図が含まれているので、これが問題かもしれません。一般的に競合の兆候はコンパイルエラーですが、万が一のために、GMObjC
のインポート方法を Pod から Carthage に変更したところ、コンパイルと実行が成功しました。。。。やはり百度地図との競合でした。非常に厄介です。。。
その後、MapManager
を再度統合し、問題二も修正することを忘れずに。。。。コンパイルと実行ができました。