8

如果你编译这个文件 p3.cxx:

class foobarclass
{
 public:
  int i0;
};

void otherfun(void);
void mumble(void);

void fun(void)
{
  try {
    otherfun();
  } catch(foobarclass &e) {
    mumble();
  }
}

像这样:

xcrun clang++ -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -fexceptions -c p3.cxx -p3.64.o

xcrun clang++ -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk -fexceptions -c p3.cxx -o p3.32.o

然后检查“typeinfo for foobarclass”的符号:

nm -m p3.64.o|grep ZTI
0000000000000110 (__DATA,__datacoal_nt) weak private external __ZTI11foobarclass

nm -m p3.32.o|grep ZTI
00000134 (__DATA,__datacoal_nt) weak external __ZTI11foobarclass

为什么arm64 案例中的符号 weak private external ?这意味着 dlsym() 在运行时找不到它。这会破坏 LibreOffice 代码库中的某些低级内容。

4

2 回答 2

1

我在相关的 Apple 开发者论坛中问了同样的问题,得到的答复是这是故意的,以减少可执行文件中全局可见符号的数量。所以我只能忍受它。

于 2014-01-22T10:32:17.213 回答
-2

将构建设置中的架构设置为标准架构(armv7,armv7s)

ARCHS = **armv7 armv7s**

VALID_ARCHS = **armv6 armv7 armv7s**

在此处输入图像描述

Xcode 可以构建包含 32 位和 64 位二进制文​​件的应用程序。此组合二进制文件需要 iOS 7 或更高版本的最低部署目标。

注意:Xcode 的未来版本将允许您创建一个在 iOS 6 及更高版本上支持 32 位运行时以及在 iOS 7 上支持 64 位运行时的应用程序。

  • Xcode 可以为单个应用程序创建 64 位 32 位二进制文​​件,但部署目标应该是 iOS7。
  • 他们说在未来它将是 iOS 6.0 32 位二进制将在 iPhone 5S(64 位处理器)中正常工作。

更新在 Xcode 5.0.1 中,他们添加了为 iOS 5.1.1 及更高版本创建 64 位二进制文​​件的支持。

Xcode 5.0.1 可以构建包含 32 位和 64 位二进制文​​件的应用程序。此组合二进制文件需要 iOS 5.1.1 或更高版本的最低部署目标。64 位二进制文​​件仅在运行 iOS 7.0.3 及更高版本的 64 位设备上运行。

于 2014-01-22T06:55:07.043 回答