不知道還有沒有人記得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上發佈了預編譯的二進制版本: