【问题标题】:Weird dynamic linking on iPhoneiPhone上奇怪的动态链接
【发布时间】:2009-08-21 19:31:15
【问题描述】:

以下代码在 Xcode 创建的模板项目中崩溃。

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 的 Base SDK 上,编译为 2.2.1 就可以了。不幸的是,我有 3.0 的增强功能。

【问题讨论】:

    标签: iphone xcode iphone-sdk-3.0 linker uint64


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复 - 非常感谢。是的,这绝对适用于一个项目,但不适用于另一个项目,因此这意味着原因是项目设置。我想我必须逐行浏览项目文件。
    • 我已经编辑了这个问题,因为这个问题与针对不同的固件版本直接相关,毕竟不是特定于项目的。
    【解决方案2】:

    如果你这样做,它会起作用。奇怪

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      相关资源
      最近更新 更多