【问题标题】:Linking with code that does not support exception handling (C++/LLVM)链接不支持异常处理的代码 (C++/LLVM)
【发布时间】:2012-03-03 11:18:04
【问题描述】:

我正在尝试将 llvm 用作我的软件的代码生成后端,并且刚刚意识到 llvm 是在不支持 C++ 异常处理的情况下编译的(为了提高效率)。然而,在我的软件中,我广泛使用异常处理。

如果我将所有回调函数包装在 try-catch-blocks 中(这样就不需要“通过”llvm 代码传播异常),那么我是否可以安全地删除“-fno-exceptions”(对于 GCC)我的链接器标志? (与 llvm 链接时通常需要此标志,因为它在执行 llvm-config --cxxflags 时会出现)。

如果不是,如果我用“throws()”声明的函数包装 llvm 函数,情况会改变吗?这些函数的实现可以用-fno-exceptions编译。

【问题讨论】:

  • 我不会赌 ABI 的兼容性,但谁知道呢?在启用异常的情况下自己编译 LLVM 可能更容易、更安全。
  • @delnan 编译 llvm 不是一种选择。我的软件被不同平台(linux、mac、windows)上的几个人使用,我需要依赖您获得的默认 llvm 安装,例如来自 apt-get。
  • @delnan:我对 ABI 兼容性不太了解,但是如果函数是用 throws() 声明的,我会明白吗?我相应地修改了问题。
  • AFAIK,大多数 Linux 发行版中的 LLVM 包都是用异常和 RTTI 构建的。
  • @arrowdodger 至少在 Ubuntu 10.4 上,情况并非如此

标签: c++ llvm


【解决方案1】:

如果我将所有回调函数包装在 try-catch-blocks 中(这样就不需要“通过”llvm 代码传播异常),那么我是否可以安全地删除“-fno-exceptions”(对于 GCC)我的链接器标志?

是的,假设您有合适的方式来报告导致抛出异常的任何条件。

-fexceptions 是 C++ 的默认值。 -fno-exceptions 是 C 的默认值。将使用默认选项编译的 C++ 代码与使用默认选项编译的 C 代码混合在一起完全没有问题,因此将-fexceptions-fno-exceptions 混合不会有问题。

但是考虑添加-fexceptions而不是删除-fno-exceptions:以与GCC完全相同的方式解析命令行选项很复杂,您无需尝试这样做。

【讨论】:

  • 好的!这就是我需要知道的。没有考虑与 C 的相似之处。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多