【问题标题】:iPhone static library Clang/LLVM error: non_lazy_symbol_pointersiPhone 静态库 Clang/LLVM 错误:non_lazy_symbol_pointers
【发布时间】:2012-03-15 03:26:01
【问题描述】:

经过几个小时的实验,我设法将问题简化为以下示例 (C++):

extern "C" void foo();

struct test
{
    ~test() { }
};

void doTest()
{
    test t; // 1
    foo();  // 2
}

这是在 XCode 4.2 中为 iOS 设备编译的,使用提供的 Clang 编译器(Apple LLVM 编译器 3.0)和 iOS 5.0 SDK。该项目配置为 Cocoa Touch 静态库,并且“启用与共享库的链接”设置为否,因为我正在构建 AIR 本机扩展。函数foo 在另一个外部库中定义。 (在我的实际项目中,这将是 Adob​​e 定义的用于 AIR 原生扩展的任何 C API 函数。)

尝试编译此代码时,我得到了错误:

FATAL:incompatible feature used: section type non_lazy_symbol_pointers (must specify "-dynamic" to be used)
clang: error: assembler command failed with exit code 1 (use -v to see invocation)

如果我注释掉上面标记为12 的行,或者如果我将构建设置“启用与共享库的链接”更改为“是”,错误就会消失。 (但是,如果我更改构建设置,则在将库链接到最终项目时会收到​​多个 ld warning: unexpected srelocation type 9 警告,并且应用程序在设备上运行时会崩溃。)如果我从中删除析构函数,构建错误也会消失test.

那么:这是 Clang 中的错误吗?我是否错过了一些非常重要且未记录的构建设置?至少可以说,外部提供的函数和带有析构函数的结构之间的交互非常奇特。

【问题讨论】:

    标签: ios xcode air static-libraries clang


    【解决方案1】:

    经过一番搜索,我终于偶然发现了 Richard Lord 的excellent blog post on AIR native extensions。事实证明,有效的开发需要使用 Adob​​e 尚未费心记录的一些标志(除非您将开发人员博客文章视为文档——我不认为)。

    长话短说:

    • 将“启用与共享库的链接”设置为“是”。将此设置为“否”是关于开发 AIR 原生扩展的最普遍的错误建议。
    • 使用 ADT 的 -platformsdk 选项指向 Apple 提供的 iOS SDK(例如:-platformsdk /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk)。这将缓解unexpected srelocation type 9 警告。 Adobe 的文档指出 -platformsdk 仅适用于 Android,但这是一个谎言。
    • 打包扩展时(即构建 ANE 文件时),使用未记录的 -platformoptions 选项指定包含附加链接器参数的 xml 文件。此 XML 文件的格式也未记录,但可以在templates/extensions/ios/platform-descriptor-template.xml 下的 AIR SDK 目录中找到模板。在同一位置还有一个 xsd 架构。该文件允许您指定您的扩展使用的任何其他框架,因此您将不受限于 AIR SDK 支持的默认框架。
    • 预计会看到新的链接器警告:ld: warning: ARM function not 4-byte aligned。这显然可以安全地忽略。据报道,Adobe 已经意识到了这个问题。我想您可以通过将-w 传递给平台选项文件中的链接器来消除此警告,但请注意-w 会消除所有警告,而不仅仅是那个警告。

    更多信息可以在 Adob​​e 工程师之一 Rajorshi Ghosh 的这两篇博文中找到:

    这仍然不能解释“启用与共享库的链接”、外部定义的函数和析构函数之间的奇怪交互,但现在这已归结为好奇问题而不是阻塞问题。

    【讨论】:

    • 我在非 AIR 案例中遇到了同样的问题。主要问题是您的第一个项目符号和设置共享链接到 yes 解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多