相关疑难解决方法(0)

如何下载Xcode DMG或XIP文件?

Mac App Store将文件下载到Lion下的哪个位置?我需要DMG文件才能修复系统中的内容,但是如何访问该文件呢?

xcode dmg

981
推荐指数
1
解决办法
150万
查看次数

使用-fno-rtti在OS X上抛出和捕获异常的问题

问题与此问题有些类似,但接受的答案并未真正提出解决方案或解决方法.

在我们的项目中,我们有一个dylib和主要的可执行文件.dylib使用-fno-rtti,而可执行文件使用RTTI 编译.当std::bad_alloc从dylib抛出异常(例如)并在exe中捕获时,会发生此问题.

(在你大喊"异常需要RTTI所以你必须有它!",请注意,必要的例外RTTI总是产生不管-frtti-fno-rtti设置.这实际上是在记录-fno-rtti标志的说明.在OS X上的问题是,它不是以相同的方式生成的)

经过一番调查,发现了以下内容:

  • 在dylib(-fno-rtti)中,有一个异常的RTTI结构的本地副本; 特别是__ZTISt9bad_alloc符号(typeinfo for std::bad_alloc).
  • exe(-frtti)从中导入typeinfo符号libstdc++.6.dylib,但没有本地副本

由于异常处理代码依赖于比较typeinfo指针来确定异常匹配,因此匹配失败,只有catch(...)成功.

到目前为止,我看到以下选项:

1)编译所有内容,或者至少编译抛出和捕获异常的文件-frtti.这是可行的,但我不喜欢为所有东西生成RTTI的想法,即使我们不使用它; 并且使用异常的文件列表很容易变得陈旧.

2)当链接dylib时,以某种方式使链接器从目标文件中丢弃弱异常定义并使用它来自libstdc++.6.dylib.到目前为止,我没有成功.

3)???

我做了一个小测试来说明这个问题.

--- throw.cpp ---
#include <iostream>

#if defined(__GNUC__)
#define EXPORT __attribute__((visibility("default")))
#else
#define EXPORT __declspec(dllexport)
#endif

EXPORT void dothrow ()
{
   std::cout << "before throw" << std::endl;
   throw std::bad_alloc();
}

--- main.cpp --- …
Run Code Online (Sandbox Code Playgroud)

c++ macos exception shared-libraries rtti

18
推荐指数
2
解决办法
3289
查看次数

标签 统计

c++ ×1

dmg ×1

exception ×1

macos ×1

rtti ×1

shared-libraries ×1

xcode ×1