2009-08-21 49 views
0

以下代码在Xcode创建的模板项目中崩溃。iPhone上奇怪的动态链接

int main(int argc, char *argv[]) 
{ 
    uint64_t t64 = 100000; 
    double s = (double)t64; // Crash! 
    ... 

该崩溃伴随着以下控制台输出,发生在2.2.1设备上,但不在3.0.1设备上。它发生在编译Thumb或ARM时。

dyld: lazy symbol binding failed: Symbol not found: ___floatundidf 
Referenced from: /var/mobile/Applications/15E9DC65-324D-4C3A-8477-DC8CFFA67DC1/MyApp.app/MyApp 
Expected in: /usr/lib/libgcc_s.1.dylib 

dyld: Symbol not found: ___floatundidf 
Referenced from: /var/mobile/Applications/15E9DC65-324D-4C3A-8477-DC8CFFA67DC1/MyApp.app/MyApp 
Expected in: /usr/lib/libgcc_s.1.dylib 

该问题只发生在3.0的基础SDK,编译为2.2.1是好的。不幸的是我有3.0的增强。

回答

0

当你说它适用于一个iPhone项目而不是另一个项目时,你是用不同的设置编译相同的代码吗?如果是这样,我会检查两者之间的不同设置,以阐明问题的根源。

___floatundidf应该是libgcc的一部分,因此它可能在2.2.1 SDK的ARM库版本中丢失,但存在于3.0.1中(因此前者崩溃而后者不崩溃)。您可以使用nm工具来检查它们是否存在。如果它缺少2.2.1,则应该向Apple提交一个错误。

+0

感谢您的答复 - 非常感谢。 是的,这绝对适用于一个项目,但不是另一个,所以其含义是项目设置。我想我必须逐行浏览项目文件。 – Robin 2009-08-22 07:39:53

+0

我编辑了这个问题,因为问题与定位不同的固件版本直接相关,毕竟不是项目特定的。 – Robin 2009-08-23 09:35:40

0

它的工作原理,如果你这样做。奇怪的

int main(int argc, char *argv[]) { 
    uint64_t t64 = 100000; 
    double s = (double)(uint64_t)t64; // Crash! 
    ...