【问题标题】:Why am i getting this clang error: _fwrite$UNIX2003 on simulator with iOS 8为什么我会收到这个 clang 错误:iOS 8 模拟器上的 _fwrite$UNIX2003
【发布时间】:2014-11-15 23:46:15
【问题描述】:

我已将新的 iOS 8 下载到我的手机中,并将最新的 Xcode 下载到我的 Mac 上。一切正常,但是在加载并尝试新的 iPhone 6 plus 模拟器后,当我尝试 iPhone 4s 或 5 模拟器(它适用于 5s)时,我收到以下错误:

Undefined symbols for architecture i386:
  "_fwrite$UNIX2003", referenced from:
      leveldb::(anonymous namespace)::PosixEnv::~PosixEnv() in Firebase(env_posix.o)
      leveldb::(anonymous namespace)::PosixEnv::~PosixEnv() in Firebase(env_posix.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我整个早上都在使用 iPhone 4 模拟器,这对我来说似乎很奇怪,但只有在我尝试 iPhone 6 plus 模拟器之后它才坏了,我无法恢复使用它

【问题讨论】:

  • 虽然你已经发布了一个重复的答案,但这个问题肯定不是重复的——一个是指关于 iOS 8 和模拟器的这个错误,另一个是指使用外部静态库
  • 这个问题显然是重复的。两者都是关于使用针对 OS X SDK 编译的静态存档将模拟器应用程序链接到 iOS 8 Simulator SDK 的链接错误。
  • 但另一个问题是在 iOS8 发布前 18 个月发布的
  • 啊,是的,所以实际上是指看到 iOS 7.1 的问题(它只是运行时错误而不是链接时错误),但问题仍然相同。开发人员尝试在 iOS 模拟器中使用针对 OS X SDK 构建的代码。

标签: ios xcode ios-simulator ios8


【解决方案1】:

fwrite$UNIX2003 是一个由 OS X 提供的符号,它不是 iOS 模拟器运行时的一部分。 iOS 总是符合标准,因此没有旧版(非 $UNIX2003)函数变体(提供这些变体是为了与针对旧版本 OS X SDK 构建的代码进行二进制兼容)。

您看到的问题的常见原因是您有一个针对 OS X SDK 构建的目标文件或存档(env_posix.o 或包含 env_posix.o 的 libsomething.a)并试图链接它进入您的 iOS 模拟器可执行文件。这不受支持,因为这两个平台在该层不兼容。

您需要针对 iOS 模拟器 SDK 重新构建 env_posix.o。

【讨论】:

  • 请告诉我如何重建 libsomething.a
  • @hardikvyas 您只需要针对适当的 SDK 重新构建您的代码。我不能给你比这更具体的说明,因为这取决于你的具体情况。
  • 谢谢,我会试试的
【解决方案2】:

this link 中提供的答案对我来说效果很好。

根据上面的链接, 为了消除所有这些错误,您必须创建一个 *.c 文件(不需要特定名称)并复制粘贴以下代码:

#include <stdio.h> 
#include <unistd.h> 
#include <string.h>
#include <stdlib.h>

FILE *fopen$UNIX2003( const char *filename, const char *mode )
{
    return fopen(filename, mode);
}

int fputs$UNIX2003(const char *res1, FILE *res2){
    return fputs(res1,res2);
}

int nanosleep$UNIX2003(int val){
    return usleep(val);
}

char* strerror$UNIX2003(int errornum){
    return strerror(errornum);
}

double strtod$UNIX2003(const char *nptr, char **endptr){
    return strtod(nptr, endptr);
}

size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
{
    return fwrite(a, b, c, d);
}

通常一切都会好的。

【讨论】:

  • 将此文件添加到项目中的任何可能性都会影响Apple拒绝该应用程序?
猜你喜欢
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多