我试图更改项目的编译器集合,该项目使用从Microsoft Visual C ++到LLVM的许多异常(try / catch块),但遇到了编译问题。
二手工具链:
以下是一些测试源代码:
#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;。但我无法理解它。
有没有人能够做到这一点?
答案 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/