0

Xcode 6 GM 及其 LLVM 6 给出了这个链接错误:

Undefined symbols for architecture i386:
"_fopen$UNIX2003", referenced from:
  _BIO_new_file in libcrypto.a(bss_file.o)
  _file_ctrl in libcrypto.a(bss_file.o)
  _open_console in libcrypto.a(ui_openssl.o)
"_fputs$UNIX2003", referenced from:
  _write_string in libcrypto.a(ui_openssl.o)
  _read_string in libcrypto.a(ui_openssl.o)
"_fwrite$UNIX2003", referenced from:
  _send_fp_chars in libcrypto.a(a_strex.o)
  _write_fp in libcrypto.a(b_dump.o)
  _file_write in libcrypto.a(bss_file.o)
  _file_puts in libcrypto.a(bss_file.o)
"_strerror$UNIX2003", referenced from:
  _ERR_load_ERR_strings in libcrypto.a(err.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

现在,这个答案建议添加一个临时.c文件,对于上述情况,该文件将是:

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

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

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

void fputs$UNIX2003(const char *restrict c, FILE *restrict f)
{
    fputs(c, f);
}

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

它“有效”,但这是最好的(甚至是可取的)方法吗?

4

2 回答 2

1

正如您所猜测的那样,不,这不是解决 Xcode 6 中 LLVM 链接器问题的可取方法。相反,假设您正在为 iOS 开发,您需要做的是为新的 iOS 8 SDK 重建 OpenSSL。这是一个很好的项目,可以帮助你做到这一点。

于 2014-10-03T06:13:10.013 回答
0

如果这可以为​​任何人节省一些时间,我发现可以解决这个特定的链接器问题(将其添加到任何任何 cpp 文件中):

extern "C"{
    size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
    {
        return fwrite(a, b, c, d);
    }
    char* strerror$UNIX2003( int errnum )
    {
        return strerror(errnum);
    }
    time_t mktime$UNIX2003(struct tm * a)
    {
        return mktime(a);
    }
    double strtod$UNIX2003(const char * a, char ** b) {
        return strtod(a, b);
    }
}
于 2014-10-15T12:42:08.413 回答