Visual Studio 2012 Build Clang

不知道還有沒有人記得Borland C/C++,C/C++四國聖戰中的主角,換了老闆 現在還在不冷不熱的發展 ,支持Win32/Win64 OSX平臺,即Embarcadero C++ Builder  如今支持Windows 64編程 最近試了一下發現還不錯,查看官方Wiki文檔,發現這廝原來是利用LLVM的開源技術和代碼,仍是LLVM 3.1svn 輸入bcc64 -vshell

Embarcadero C++ 6.50 for Win64 Copyright (c) 2012 Embarcadero Technologies, Inc.
Embarcadero Technologies Inc. bcc64 version 3.1 (32943.3c8f9c0.7346645) (based on LLVM 3.1svn)
Target: x86_64-pc-win32-elf
Thread model: posix
bcc64: warning: argument unused during compilation: '-fborland-extensions'
bcc64: warning: argument unused during compilation: '-mstackrealign'

這廝是32位程序編譯64位程序編程

這樣我對LLVM又高看一些了後端

事實上LLVM的優點有目共睹,Clang的優點也是使人稱讚,可是LLVM主要的平臺OSX,(例如,XCode是LLVM/Clang主要的IDE,LLDB目前只有在OSX上使用,Libcxx也只在OSX上普遍使用,雖然在Linux上 這些項目都可以使用,但仍是有所欠缺)對Windows的支持並非很好   ,因此在Windows上使用LLVM/Clang存在一些問題,在Windows上如何使用而且解決使用LLVM/Clang 的問題,因爲本文主要是講Clang,因此後文中都只講Clang。 api

一.構建Clang 
前面我曾經寫了一篇文章 講述瞭如何使用MinGW官方版構建Clang
抄小路-http://my.oschina.net/GIIoOS/blog/97387
通常而言在Windows上使用什麼工具構建Clang,Clang的後端就是什麼工具,如用MSVC構建Clang,後端就是Link.exe 因此選擇什麼工具構建Clang時要想明白。
Cygwin構建Clang和MinGW同樣 是一向的Configure-make風格,而且Cygwin的軟件包中也有編譯好的Clang,目前版本是3.1
在Windows上還可使用Visual Studio 構建Clang 官方網站也有說明。 
 
我在使用Visual Studio 2012 編譯Clang以前遇到了一些問題
第一 安裝Python27,GnuWin,Cmake 這些工具的版本必須合適,Python33就不行,cmake版本必須大於2.8.7,GnuWin的工具通常在 http://gnuwin32.sourceforge.net/ 有下 沒必要擔憂,若是本身構建sed程序,高版本的sed可能沒法解析字符串。
第二 你能夠寫一個批處理腳本設置PATH,並運行腳本,個人腳本以下 svn

::Build.Batch.Script
@echo off
title Build.Script LLVM/Clang Environment
echo Build.Script %date% %time% Start
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
SET PATH=%~dp0CMAKE\bin;D:\Python27;%~dp0GetGnuWin32\bin;%~dp0libxml2\bin;D:\Program Files\TortoiseSVN\bin;%PATH%
::cmake uzip on %~dp0cmake
cd /d %~dp0
cmd /k

像上次文章中那樣配置源文件便可。不過得注意, cmake不支持在源代碼目錄生成程序,因此你須要在LLVM目錄下創建一個Build或Out之類的目錄,並跳轉到這個目錄 
工具

cmake -G "Visual Studio 11" ..\

這個命令的意思即在Build或Out目錄的上級目錄 自動檢測CMakelists.txt並配置項目,設置平臺爲VS11 
測試

compiler-rt 放在projects目錄,目錄名記得小寫,不然編譯不過去。
網站

第三 用Visual Studio打開項目編譯爲 MinSizeRel VS利用CPU的能力在Windows上仍是不錯的,GCC通常沒注意利用多核能力 

在Windows上VS靜態連接的Clang體積 11,412,992 字節 (10.8M) 而Mingw編譯的40,368,474 字節(38.4M) 差距仍是蠻大的,究其緣由,問題出如今MinGW 的w32api上,w32api模塊沒作好,沒有VS Win32API那樣緊密結合系統。ui

從MinSizeRel提取clang創建clang的目錄 創建以下
Clang(LLVM)
      -bin
      -include
      -lib
      -share
目錄樹
Clang(LLVM) \bin 目錄中的程序在 Build\bin\MinSizeRel ,
\include 複製源代碼目錄include和源代碼tools\clang目錄下的Include
\lib  Build\lib\MinSizeRel
share 沒有生成 
編碼


配置Clang的環境

@echo off
title The LLVM Compiler Infrastructure [3.3] C/C++ Compiler
echo      LLVM/Clang 3.3 Trunk Environment Base on Visual Studio 2012 Build
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat"
SET PATH=%~dp0bin;%PATH%
SET INCLUDE=%~dp0include;%INCLUDE%
SET LIB=%~dp0lib;%LIB%
cd /d %~dp0
cmd /k


使用Clang的時候存在一些問題
目前Clang基於Visual Studio 編譯的Clang 默認 支持的Include目錄是 LLVM_INSTALL_PATH\bin\..\ lib\clang\[version]\include 但LLVM_INSTALL_PATH\bin\..\include不支持,要使用%Include%設置  VC的也要是指定環境。
第一 Clang++不兼容Visual C++ STL,因此沒法正常編譯 ,未引用STL的C++程序能夠編譯經過,連接器爲link.exe 在連接.O文件的時候須要注意額外的添加必須的庫,包括CRT
第二 Clang 編譯C 標準的STD程序,能夠直接-O生成目標程序,其餘的就必需要傳遞庫名,通過測試能夠發現基於Visual Studio 構建的clang 能夠識別%include%環境變量,-internal-isystem "INCLUDE_PATH",事實上BCC64正是這樣作的,不過BCC更善於使用配置文件(.cfg configure)  來初始化環境,clang則是將搜索目錄硬編碼。,固然有好處也有壞處。link.exe一直對%lib%敏感 因此連接LLVM相關lib並不存在很嚴重的問題。  

查看libcxx的源代碼 發現Windows下是基於CRT實現的 使用Visual C++編譯卻發現代碼不兼容。 

Cmake能夠直接打包,前提安裝了NISI,控制檯下進入Build目錄 CPack就能夠了 在安裝了 Visual Studio 2012的計算機上均可以正常編譯C程序,不使用C++STD的C++程序也是能夠經過編譯,Win32和Win64位主機都能使用,但編譯的程序是32位的。

我在SF上發佈了預編譯的二進制版本:

http://sourceforge.net/projects/clangonwin/

相關文章
相關標籤/搜索