首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCode:库中一个特定方法的“未定义符号”(iOS)

XCode:库中一个特定方法的“未定义符号”(iOS)
EN

Stack Overflow用户
提问于 2014-01-02 14:38:45
回答 3查看 2.1K关注 0票数 1

我有一个测试项目,是链接到一个游戏引擎静态库。我成功地为OS和iOS构建了它,然后在实验中将库方法的新用法添加到我的应用程序代码中(已经有了一些其他用法):

代码语言:javascript
复制
std::vector<Node*> allNodes;
_scene->findNodes("", allNodes, true, false);

在此之后,iOS构建开始产生链接器错误(尽管OS构建仍然正常):

代码语言:javascript
复制
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)

同时,其他功能(甚至来自同一类场景)也是连接在一起的,并且工作良好。此方法具有以下签名:

代码语言:javascript
复制
unsigned int findNodes(const char* id, std::vector<Node*>& nodes, bool recursive = true, bool exactMatch = true) const;

在.cpp文件中,它的实现具有匹配的签名:

代码语言:javascript
复制
unsigned int Scene::findNodes(const char* id, std::vector<Node*>& nodes, bool recursive, bool exactMatch) const

但还是没有联系。这种特殊的方法会有什么问题?

XCode版本为5.0.2

编辑1:库是从armv7 7/armv7 7s架构的源代码构建的,因此应用程序本身也是如此。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-03 06:05:48

问题来自C++11。我的应用程序使用它,但引擎库不使用。在库设置中,"C++语言方言“和"C++标准库”选项设置为“编译器默认”。在应用程序设置中,它们分别设置为"C++11 -std=c++11“和"Compiler默认设置”。有了这些选项,我曾经有许多用于std函数的链接器错误,所以我还在“”部分手动指定了libc++.dylib,并且一切都正常工作了一段时间。然而,这种组合的选择导致了这种奇怪的行为。

我通过从列表中删除libc++.dylib并将"C++标准库“设置为"libc++”来解决这个问题。库选项保持不变。在比较了库和对象文件的nm输出之后,我开始朝这个方向看:

代码语言:javascript
复制
$ 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::__1中的“”差异)。

谢谢塞尔吉奥提供的线索。

票数 0
EN

Stack Overflow用户

发布于 2014-01-02 14:59:07

在体系结构armv7中找不到符号

方法游戏::场景::findNodes不是为armv7构建的(旧的IOS设备的“二进制代码”,目前为止是标准的)。

解决办法?

( a)不要考虑旧设备,只为armv7s构建--也许您使用的库在那里工作

xcode >项目设置/目标设置 VALID_ARCHS=armv7s

( b)向制造者投诉

如果您不信任错误,请与lipo检查:

gmaps示例

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

票数 0
EN

Stack Overflow用户

发布于 2014-01-02 15:45:33

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20885298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档