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++ Language Dialect”和“C++ Standard Library”设置为“Compiler Default”。在应用程序设置中,它们分别设置为“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 的符号

方法 game::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

您说您添加了一个新方法,并且链接器找不到此方法。

一种可能的解释是您正在链接旧版本的库,该版本不包含您添加到其中的最新方法。要么手动重新编译库,要么指定测试二进制文件和库之间的依赖关系。

它可以帮助清理项目(您甚至可以完全删除“build”目录)并从头开始重新编译。

于 2014-01-02T15:45:33.493 回答