可以在LLVM / MSVC上编译try-catch块吗?

时间:2015-10-01 10:06:24

标签: c++ visual-studio msbuild clang llvm

我试图更改项目的编译器集合,该项目使用从Microsoft Visual C ++到LLVM的许多异常(try / catch块),但遇到了编译问题。

二手工具链:

  • Visual Studio 2015 Enterprise(MSVC 14)
  • LLVM 3.7 Windows / x64

以下是一些测试源代码:

#include <iostream>
int main()
{
    try
    {
        throw 20;
    }
    catch (int e)
    {
        std::cout << "An exception occurred. Exception Nr. " << e << '\n';
    }
    return 0;
}

使用内置的Visual Studio编译器集合(v140)编译代码,这是命令行结果:

ClCompile:
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\CL.exe
      /c /ZI /nologo /W3 /WX- /sdl /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise
      /Zc:wchar_t /Zc:forScope /Zc:inline /Fo "Debug\\" /Fd"Debug\vc140.pdb" /Gd /TP
      /analyze- /errorReport:queue Main.cpp
  Main.cpp
Link:
  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\link.exe
      /ERRORREPORT:QUEUE /OUT:"C:\Users\jurocha\Desktop\ClangExcept\Debug\ClangExcept.exe"
      /INCREMENTAL /NOLOGO kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
      advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
      /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /Debug
      /PDB:"C:\Users\jurocha\Desktop\ClangExcept\Debug\ClangExcept.pdb" /TLBID:1
      /DYNAMICBASE /NXCOMPAT
      /IMPLIB:"C:\Users\jurocha\Desktop\ClangExcept\Debug\ClangExcept.lib"
      /MACHINE:X86 Debug\Main.obj

编译成功。

现在,将编译器更改为LLVM(LLVM-vs2014):

ClCompile:
  C:\Program Files\LLVM\3.7\msbuild-bin\CL.exe
      /c /ZI /nologo /W3 /WX- /sdl /Od /Oy- /D _MBCS /Gm /EHsc /RTC1 /MDd /GS /fp:precise
      /Zc:wchar_t /Zc:forScope /Zc:inline /Fo"Debug\\" /Fd"Debug\vc140.pdb" /Gd /TP
      /analyze- /errorReport:queue -m32 -fmsc-version=1900 Main.cpp
clang-cl.exe : warning : argument unused during compilation: '/ZI' [ClangExcept.vcxproj]
clang-cl.exe : warning : argument unused during compilation: '/Gm' [ClangExcept.vcxproj]
clang-cl.exe : warning : argument unused during compilation: '/GS' [ClangExcept.vcxproj]
Main.cpp(7,3): error : cannot use 'throw' with exceptions disabled [ClangExcept.vcxproj]
                  throw 20;
                  ^
Main.cpp(5,2): error : cannot use 'try' with exceptions disabled [ClangExcept.vcxproj]
          try
          ^
  2 errors generated.

根据此文件,http://clang.llvm.org/docs/MSVCCompatibility.html: &#34;例外和SEH:部分&#34;。但我无法理解它。

有没有人能够做到这一点?

2 个答案:

答案 0 :(得分:3)

您链接到的LLVM页面

  

例外与SEH:偏见。 C ++异常(try / catch / throw)和结构化异常(__try / __except / __finally)主要适用于x64。 正在开展32位异常处理支持。

但在VC ++的链接参数中,您有/MACHINE:X86,并且还将-m32传递给LLVM,这表明您尝试构建一个32位应用程序 - 该模型不起作用

更改您的设置以构建64位可执行文件。

答案 1 :(得分:0)

现在有例外的例子使用LLVM-3.9.0svn-r258602-win64.exe编译,甚至可以使用Visual 2015社区更新1以32位运行,可在此处找到 http://sourceforge.net/projects/clangonwin/