为什么我得到这个clang错误:_fwrite $ UNIX2003在iOS 8的模拟器上

时间:2014-09-22 04:42:23

标签: ios xcode ios-simulator ios8

我已将新的iOS 8下载到我的手机和最新的Xcode到我的Mac上。这一切都运行良好,但在我尝试iPhone 4s或5个模拟器(它与5s一起工作)加载并尝试新的iPhone 6 plus模拟器后,我收到以下错误:

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模拟器后它才会中断,我无法恢复使用

2 个答案:

答案 0 :(得分:13)

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);
}
通常一切都应该没问题。

答案 1 :(得分:5)

fwrite $ UNIX2003是OS X提供的符号,不属于iOS Simulator运行时。 iOS 总是符合,因此没有遗留(非$ UNIX2003)函数变体(提供与针对旧版OS X SDK构建的代码的二进制兼容性)。

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

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