1

ゲーム エンジンの静的ライブラリにリンクされたテスト プロジェクトがあります。OS X および iOS 用にビルドすることに成功し、実験中にアプリケーション コードにライブラリ メソッドの新しい使用法を追加しました (既に他の使用法がいくつかあります)。

std::vector<Node*> allNodes;
_scene->findNodes("", allNodes, true, false);

その後、iOS ビルドでリンカー エラーが発生し始めました (OS X ビルドは引き続き正常に動作します)。

Undefined symbols for architecture armv7:
  "gameplay::Scene::findNodes(char const*, std::vector<gameplay::Node*, std::allocator<gameplay::Node*> >&, bool, bool) const", referenced from:
      App::initialize() in App.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Undefined symbols for architecture armv7s:
  "gameplay::Scene::findNodes(char const*, std::vector<gameplay::Node*, std::allocator<gameplay::Node*> >&, bool, bool) const", referenced from:
      App::initialize() in App.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

同時に、他の機能 (同じクラスのシーンからでも) がリンクされ、正常に動作します。このメソッドには次のシグネチャがあります。

unsigned int findNodes(const char* id, std::vector<Node*>& nodes, bool recursive = true, bool exactMatch = true) const;

.cpp ファイルでは、その実装に一致する署名があります。

unsigned int Scene::findNodes(const char* id, std::vector<Node*>& nodes, bool recursive, bool exactMatch) const

それでもリンクしない。この特定の方法で何が問題になる可能性がありますか?

XCode のバージョンは 5.0.2 です

編集 1: ライブラリは、アプリ自体と同様に、armv7/armv7s アーキテクチャのソースから構築されました。

4

3 に答える 3

0

問題は C++11 から発生しました。私のアプリはそれを使用していますが、エンジン ライブラリは使用していません。ライブラリ設定で、オプション「C++ 言語の方言」と「C++ 標準ライブラリ」が「コンパイラのデフォルト」に設定されています。アプリの設定では、それぞれ「C++11 [-std=c++11]」と「コンパイラのデフォルト」に設定されていました。これらのオプションを使用すると、std 関数で多くのリンカー エラーが発生したことがあったため、「ライブラリとバイナリをリンクする」セクションで libc++.dylib を手動で指定し、しばらくの間はすべて正常に動作しました。ただし、このオプションの組み合わせにより、このような奇妙な動作が発生しました。

リストから libc++.dylib を削除し、「C++ 標準ライブラリ」を「libc++」に設定することで問題を修正しました。ライブラリ オプションは変更されていません。nmライブラリとオブジェクト ファイルの出力を比較した後、この方向に目を向け始めました。

$ nm -arch armv7 -A Products/Debug-iphoneos/libgameplay.a | grep findNodes
...
Products/Debug-iphoneos/libgameplay.a:Scene.o: 00000ea0 T __ZNK8gameplay5Scene9findNodesEPKcRNSt3__16vectorIPNS_4NodeENS3_9allocatorIS6_EEEEbb
...
$ c++filt __ZNK8gameplay5Scene9findNodesEPKcRNSt3__16vectorIPNS_4NodeENS3_9allocatorIS6_EEEEbb
gameplay::Scene::findNodes(char const*, std::__1::vector<gameplay::Node*, std::__1::allocator<gameplay::Node*> >&, bool, bool) const

$ nm -arch armv7 -A Intermediates/Rebus.build/Debug-iphoneos/Rebus-ios.build/Objects-normal/armv7/App.o | grep findNodes
<long_path>App.o: U __ZNK8gameplay5Scene9findNodesEPKcRSt6vectorIPNS_4NodeESaIS5_EEbb
$ c++filt __ZNK8gameplay5Scene9findNodesEPKcRSt6vectorIPNS_4NodeESaIS5_EEbb
gameplay::Scene::findNodes(char const*, std::vector<gameplay::Node*, std::allocator<gameplay::Node*> >&, bool, bool) const

(std::vector の「__1」の違いに注意してください)。

手がかりをありがとう@sergio。

于 2014-01-03T06:05:48.653 に答える
0

アーキテクチャー armv7 のシンボルが見つかりません

メソッドgameplay::Scene::findNodesはarmv7用にビルドされていません(古いIOSデバイス用の「バイナリコード」であり、まだ標準です)

解決?

a)古いデバイスを考慮せず、armv7s用にのみビルドします[使用するライブラリがそこで機能する可能性があります]

xcode > プロジェクト設定 / ターゲット設定
VALID_ARCHS=armv7s

b) メーカーに文句を言う


エラーが信頼できない場合は、 lipoで確認してください。

gmap の例

lipo -info /Users/dominik/Documents/work-sapient/project-myAudi/svn/myAudi-IntApp/Vendor/GoogleMaps/GoogleMaps.framework/GoogleMaps

Architectures in the fat file: /Users/dominik/Documents/work-sapient/project-myAudi/svn/myAudi-IntApp/Vendor/GoogleMaps/GoogleMaps.framework/GoogleMaps are: armv7 armv7s i386

于 2014-01-02T14:59:07.020 に答える
0

新しいメソッドを追加したが、このメソッドがリンカによって見つからないと言います。

考えられる説明の 1 つは、追加した最新のメソッドが含まれていない古いバージョンのライブラリに対してリンクしていることです。ライブラリを手動で再コンパイルするか、テスト バイナリとライブラリ間の依存関係を指定します。

プロジェクトをクリーンアップし (「ビルド」ディレクトリを完全に削除することもできます)、ゼロから再コンパイルするのに役立ちます。

于 2014-01-02T15:45:33.493 に答える