我的 iPhone 应用程序无法链接到 iPhone 模拟器时遇到一些问题。它告诉我有 undefined symbol :
Undefined symbols for architecture i386:
".objc_class_name_NSRunLoop", referenced from:
pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
".objc_class_name_NSDate", referenced from:
pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
".objc_class_name_NSAutoreleasePool", referenced from:
pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
pointer-to-literal-objc-class-name in libRenderSystem_GLES2Static.a(OgreEAGL2Window.mm.o)
".objc_class_name_UIApplication", referenced from:
pointer-to-literal-objc-class-name in SampleBrowser.cpp.o
pointer-to-literal-objc-class-name in libOIS.a(iPhoneInputManager.mm.o)
".objc_class_name_NSObject", referenced from:
.objc_class_name_AppDelegate in SampleBrowser.cpp.o
".objc_class_name_UIView", referenced from:
.objc_class_name_SampleBrowserGestureView in SampleBrowser.cpp.o
.objc_class_name_InputDelegate in libOIS.a(iPhoneInputManager.mm.o)
.objc_class_name_EAGL2View in libRenderSystem_GLES2Static.a(OgreEAGL2View.mm.o)
".objc_class_name_UIScreen", referenced from:
pointer-to-literal-objc-class-name in libOIS.a(iPhoneInputManager.mm.o)
pointer-to-literal-objc-class-name in libRenderSystem_GLES2Static.a(OgreEAGL2Support.mm.o)
".objc_class_name_UIAccelerometer", referenced from:
pointer-to-literal-objc-class-name in libOIS.a(iPhoneInputManager.mm.o)
pointer-to-literal-objc-class-name in libOIS.a(iPhoneAccelerometer.mm.o)
但这些看起来像是来 self AM 链接的框架的 Objective-C 类的名称。我想做一些挖掘,所以我使用 nm 查看我链接的框架的符号列表。比如
josh$ nm /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/Foundation.framework/Foundation -arch i386 -g | grep objc_class
001a4500 S $ld$add$os10.4$.objc_class_name_NSArray
001a4501 S $ld$add$os10.4$.objc_class_name_NSCalendar
001a4502 S $ld$add$os10.4$.objc_class_name_NSData
001a4503 S $ld$add$os10.4$.objc_class_name_NSDate
001a4504 S $ld$add$os10.4$.objc_class_name_NSDateComponents
001a4505 S $ld$add$os10.4$.objc_class_name_NSDictionary
001a4506 S $ld$add$os10.4$.objc_class_name_NSEnumerator
001a4507 S $ld$add$os10.4$.objc_class_name_NSException
001a4508 S $ld$add$os10.4$.objc_class_name_NSInputStream
001a4509 S $ld$add$os10.4$.objc_class_name_NSInvocation
001a450a S $ld$add$os10.4$.objc_class_name_NSLocale
001a450b S $ld$add$os10.4$.objc_class_name_NSMethodSignature
001a450c S $ld$add$os10.4$.objc_class_name_NSMutableArray
001a450d S $ld$add$os10.4$.objc_class_name_NSMutableData
001a450e S $ld$add$os10.4$.objc_class_name_NSMutableDictionary
001a450f S $ld$add$os10.4$.objc_class_name_NSMutableSet
001a4510 S $ld$add$os10.4$.objc_class_name_NSNull
001a4511 S $ld$add$os10.4$.objc_class_name_NSObject
001a4512 S $ld$add$os10.4$.objc_class_name_NSOutputStream
001a4513 S $ld$add$os10.4$.objc_class_name_NSRunLoop
001a4514 S $ld$add$os10.4$.objc_class_name_NSSet
001a4515 S $ld$add$os10.4$.objc_class_name_NSStream
001a4516 S $ld$add$os10.4$.objc_class_name_NSTimeZone
001a4517 S $ld$add$os10.4$.objc_class_name_NSTimer
001a4548 S $ld$add$os10.4$.objc_class_name_NSURL
001a4518 S $ld$add$os10.4$.objc_class_name_NSUserDefaults
001a4549 S $ld$add$os10.5$.objc_class_name_NSURL
001a454a S $ld$hide$os10.4$.objc_class_name_NSFileWrapper
001a454b S $ld$hide$os10.5$.objc_class_name_NSFileWrapper
001a454c S $ld$hide$os10.6$.objc_class_name_NSFileWrapper
现在,这个符号列表让我觉得框架存档正在导出链接器正在寻找的类。唯一不同的是这个 $ld$add$os10.4$ 前缀。我想知道为什么它在那里,它意味着什么,这是否可能导致我的问题?
编辑: 看起来这是我的问题: Link errors in Xcode when targeting iPhoneSimulator
简而言之,省略编译器标志 -fobjc-abi-version=2 会导致不同的符号命名。
最佳答案
$ld$add$osXX.X$SYMBOL 是一个链接器指令,允许在库中重定向符号解析。该命令位于二进制文件的 __DATA 部分,并在链接时由 ld 解析,以更改导出符号的可见性。 OS X 上的链接器实际上接受许多不同类型的命令:
$ld$hide$osXX.X$SYMBOL 将该符号添加到忽略集中。链接器将不再将该符号导出到与库链接的任何二进制文件,即使它可能具有全局可见性。
$ld$add$osXX.X$SYMBOL 在链接时将该符号添加到二进制文件中,无论是否存在定义。
$ld$install_name$osXX.X 将特定二进制文件中符号的定义重定向到另一个二进制文件。这用于解决 OS X 中的一个问题,其中 CoreGraphics 曾经作为 ApplicationServices 的子框架存在。所有符号现在都重定向到适当的框架。
$ld$compatibility_version 强制与早期版本的链接器兼容。
在您的案例中,您遇到了 Foundation 中的兼容性问题。 OS X 在 AppKit 中导出 NSFileWrapper 直到 10.7,当时该符号从那里隐藏并移至 Foundation。通常,这意味着 AppKit 的作者会隐藏类定义的 _OBJC_CLASS_$、_OBJC_METACLASS_$ 和 _OBJC_IVAR_$ 部分,以使链接器在别处寻找该符号。但是,因为您删除了 -fobjc-abi-version 标志,编译器默认返回旧的 1.x ABI,它只需要隐藏和查找 .objc_class_name您尝试链接的二进制文件中可能不存在。
至于您 undefined symbol ,这是一个简单的文件扩展名问题。 .cpp 是 only 文件(这意味着没有 NSRunloop、MSMutableArray、NSObject 等)。如果您希望访问这些对象,请将有问题的文件重命名为扩展名为 .mm 的标准 objC++ 文件。链接和导入 QuartzCore(用于 EAGL2View)和 UIKit(用于 UIScreen 和其他 friend 以及 UIAccelerometer)也是一个好主意。
关于ios - 当我使用 nm 查看 Mac 上的符号列表时,$ld$add$os10.4$ 前缀是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10134189/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我想将我的MacSnowLeopardruby从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195