iOS+;C:在静态框架中使用uu属性u((u构造函数u))

iOS+;C:在静态框架中使用uu属性u((u构造函数u)),ios,c,clang,llvm-clang,Ios,C,Clang,Llvm Clang,我在谷歌上搜索了好几次,想找到一个明确的答案,但都找不到 我们的iOS应用程序需要使用跨平台资源。我已经将它们打包为静态框架,并获得了一个测试应用程序来成功链接并调用它 我遇到的问题是,它大量使用全局静态构造函数 我看到不稳定的行为,只有一部分对象被实例化,但不是全部 我的问题是: 静态构造函数是否在iOS静态上下文中工作 自由党 如何调试这样的问题 谢谢 静态构造函数是否在iOS静态库的上下文中工作 它们只有在链接到可执行文件后才开始工作,但一旦完成,它们就会工作 如何调试这样的问题 有几种方

我在谷歌上搜索了好几次,想找到一个明确的答案,但都找不到

我们的iOS应用程序需要使用跨平台资源。我已经将它们打包为静态框架,并获得了一个测试应用程序来成功链接并调用它

我遇到的问题是,它大量使用全局静态构造函数

我看到不稳定的行为,只有一部分对象被实例化,但不是全部

我的问题是:

  • 静态构造函数是否在iOS静态上下文中工作 自由党
  • 如何调试这样的问题
  • 谢谢

    静态构造函数是否在iOS静态库的上下文中工作

    它们只有在链接到可执行文件后才开始工作,但一旦完成,它们就会工作

    如何调试这样的问题

    有几种方法

    • 您必须假定构造函数的调用没有特定的顺序
    • 确保构造函数链接到可执行文件中(使用nm来确定)
    • 您可以尝试使用
      -Wl,-all\u load
      将所有归档文件的所有组件加载到可执行文件中(或
      -Wl,-force\u load,libstatic.a
      仅加载特定的静态归档文件)
  • 静态库中的构造函数被不规则地调用
  • 使用-all_load和-force_load在调用构造函数属性标记函数时没有任何区别
  • 您需要做的是:
    • 确保构造函数是全局符号。通过符号文件导出它们来完成此操作
    • 考虑创建一个init函数,并使用链接器设置“初始化例程”来控制全局对象实例化的顺序

  • 这些标志(-Wl,-all_load&-Wl,-force_load)是作为静态库构建的一部分传递的,还是作为链接到静态库的应用构建的一部分传递的?此外,我对框架进行了研究,发现通过相同的宏函数实例化的对象的符号值不稳定:(1)所有符号都以“t”[非外部](2)有些符号具有地址/偏移值;其他人的地址/偏移量为00000000。从逻辑上讲,这些标志可能应该在应用程序的项目中使用。我会给它一个镜头和更新。-所有的加载和-强制加载没有任何区别。