LLVM/Clang On Windows 2013_09

好吧,好久沒有寫博客了,最近LLVM/Clang的主幹版本取得了很大的進步,便在這裏彙報下分析心得。 html

我很是建議研究LLVM/Clang的朋友在本身電腦上安裝TortoiseSVN 而且將LLVM的源代碼Clone下來,LLVM的svn地址:http://llvm.org/svn/llvm-project/ 在這個頁面有LLVM組織絕大部分項目的源代碼。
克隆LLVM:svn co http://llvm.org/svn/llvm-project/llvm YourDir/LLVM
克隆Clang:svn co http://llvm.org/svn/llvm-project/cfe YourDir/clang
c++

如何在Windows上構建LLVM/Clang,之前的博客有說過,目前在Windows上可以構建LLVM/Clang的有:
Visual Studio 2010
Visual Studio 2012 shell

Mingw Mingw64 Cygwin svn

特別指出,VisualStudio 2013暫時構建LLVM/Clang雖然能構建成功,可是Clang沒法編譯文件,這是clang內部支持沒有更新,在clang的drive(WindowsToolChain.cpp)的源文件中,目前仍沒有完善VS11的支持。而Cygwin64暫時沒法經過編譯,configure過程便已經失敗。Mingw雖然都能編譯,但高版本編譯的clang的沒法使用 函數

通常狀況下VisualStudio編譯的clang速度要比Mingw編譯的體積要小,反應速度快,因此我更傾向於使用VisualStudio 2012編譯clang,在9月28日我將LLVM svn主幹版本(3.4)的代碼用VisualStudio構建一次,這次在LLVM源文件目錄添加了 tools/clang tools/lld projects/libcxx tools/clang/tools/extra 用cmake-gui分別配置了 VisualStudio 11 已經VisualStudio 11(win64)兩個解決方案,選擇MinSizeRel(優化最好)編譯完成後將bin下的MinSizeRel 改爲Release lib下的MinSizeRel改爲Release,用cpack跳轉到項目目錄,生成安裝包。 測試

LLVM安裝包源目錄呈下結構:
LLVM\
 -----bin
 -----include
 -----lib
 -----msbuild-bin
 -----share
 -----tools
是否是很驚訝有msbuild-bin目錄啊,目錄下游cl.exe 而tools目錄下也有msbuild 而且有Microsoft.Cpp.Win32.LLVM-vs2010.props Microsoft.Cpp.Win32.LLVM-vs2012.props 等文件,熟悉VisualStudio的都知道這是項目屬性文件,與MSBuild VisualStudio IDE密切相關的,很明顯,LLVM/Clang開始添加了VS IDE支持,不過,不要高興得太早,通過大量測試,我發現一些問題: 優化

Clang 支持VisualStudio近況

2013.09.29
clang-cl cl基於clang
clang會根據名稱實行多種模式。
  static const struct 
{
    
const char *Suffix;
    
const char *ModeFlag;
  
} suffixes [] = {
    
{ "clang",     0 },
   
{ "clang++",   "--driver-mode=g++" },
    
{ "clang-c++", "--driver-mode=g++" },
    
{ "clang-cc",  0 },
    
{ "clang-cpp", "--driver-mode=cpp" },
    
{ "clang-g++", "--driver-mode=g++" },
    
{ "clang-gcc", 0 },
    
{ "clang-cl",  "--driver-mode=cl"  },
    
{ "cc",        0 },
    
{ "cpp",       "--driver-mode=cpp" },
    
{ "cl" ,       "--driver-mode=cl"  },
    
{ "++",        "--driver-mode=g++" },
  
};
clang 默認模式爲0的是全支持,特別指出--drver-mode=cl 這種模式支持模擬Visual C++ cl.exe 而且在最近的svn主幹版本支持VisualStudio IDE 對C的支持沒有問題,編譯C++則須要特定的參數;
clang clang++(--driver-mode=g++ 使用Itanium C++ ABI)等可以編譯C++程序,而且可以使用Visual C++的C++標準庫文件,可是可能因爲ABI的問題,沒法連接,對不包含C++標準庫的文件連接不存在問題。 關於wchar_t的支持,因爲基於VisualStudio的Clang使用C Runtime ,因此支持 wmain wWinMain 可是須要指出,clang++ 編譯C++程序 若是有wmain 會按照C++的ABI處理wmain 這就致使沒有程序入口點,須要用extern "C" 在對應的函數前聲明。這從必定程序上說明在Windows 上給予VisualStudio構建的clang用來開發C++程序依然是不建議的選擇。
最大特點,支持使用VisualStudio C++標準庫文件,但因爲Clang默認使用的是Itanium ABI ,而VisualStudio C++使用Microsoft ABI,名字改編的規則不同,故連接時會出現錯誤。
特別的clang-cl 也就是--driver-mode=cl 默認支持Microsoft C++ ABI 可是不支持RTTI因此須要添加 -D_HAS_EXCEPTIONS=0 /GR- 事實上clang都是一套代碼,clang.exe clang++.exe clang-cl.exe cl.exe 文件的大小 HAS都是一致的,可是因爲程序名字不相同,傳入的argv[0]不一樣,驅動模型也是不一樣的。你能夠去嘗試一下更名後編譯源文件測試。而且wmain wWinMain clang-cl 都是支持的,在 --driver-mode=0 的Suffix 能夠添加--driver-mode 參數動態指定驅動模型

在Clang源代碼目錄 下lib\CodeGen 存在MicrosoftCXXABI.cpp;若是要使用clang支持VisualC++ C++標準庫 要使用clang的clang-cl 或者是cl(即 "--driver-mode=cl") 而且須要使用/GR- -D_HAS_EXCEPTIONS=0 兩個參數,即clang-cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp 生成file.exe 。能夠說,有點複雜。一樣也能夠用: ui

#If clang:
clang --driver-mode=cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp
#If clang-cl.exe or cl.exe:
clang-cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp
#
cl -D_HAS_EXCEPTIONS=0 /GR- file.cpp

若是有更多問題請聯繫我 spa

若是要測試請下載ClangOnWin:https://sourceforge.net/projects/clangonwin/ .net

相關文章
相關標籤/搜索