如何在Windows上编译Clang

我一直在试图find一种方法让Clang在Windows上工作,但遇到了麻烦。 我得到了Clang编译成功,但是当我尝试编译一个程序时,我在标准头文件中有一堆错误。

我知道rubenvb的铿锵的预编译版本 ,但我想为自己编译它。 我也在听GoingNative谈论关于铿锵声说它还没有很好的Windows支持。 我怎样才能在Windows上铿锵声工作?

我用下面的方法在Windows 7上编译C ++的clang,并且已经被Mysticial和其他人validation了:

  1. 下载并安装MinGW (确保你安装了C ++编译器)并把bin文件夹放到你的PATH中(我有MinGW 4.6.1,并且在4.6.2的另一台计算机上成功testing过)
  2. 确保你的Python中有Python ( 不是3 ,我有2.7)
  3. (可选:确保你的PATH中有Perl(我使用ActivePerl 5.14.2 64位))
  4. 获取CMake并将其放入PATH中
  5. 转到LLVM下载页面,并下载LLVM 3.0源代码以及Clang源代码。 不要从SVN获取代码,它不适用于MinGW头。
  6. 提取源代码; 我的桌面上有一个名为llvm-3.0.src的文件夹中的llvm源文件
  7. 将clang源文件直接放在一个名为“clang”的文件夹中(它必须被完全调用,否则你将构buildllvm,但是clang不会被构build)在llvm源文件夹中的“tools”文件夹中,这会使你的目录看上去像喜欢:
    • llvm来源
      • autoconf文件夹
      • 工具文件夹
        • 铛文件夹
          • 绑定文件夹
          • Makefile文件
  8. 在与llvm源文件夹相同的目录中创build一个名为“build”的文件夹
  9. 打开一个命令行并cd到build文件夹中
  10. 运行命令cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src

    • (最后一个参数是包含llvm源文件夹的相对path(以及tools / clang子目录中的clang源文件))

    • 这将执行相当于“configuration”命令,生成文件和生成文件夹中的所有内容

    • 这将需要几分钟的时间
  11. 运行命令mingw32-make

    • 这将编译llvm和clang,并将在build / bin文件夹中生成clang可执行文件
    • 这可能需要很长时间。 (你可以尝试通过添加并行构build来加速它, -j<number>选项)closures所有其他程序可能会很好,这样你的计算机可以集中精力,所以它们不会干扰冗长的编译过程,比如因为locking了编译器正在写入的文件夹(它发生在我身上)。 我甚至closures了我的防病毒软件和防火墙软件,这样他们就不会尝试扫描生成的文件并阻止。

testing它的时间

  1. 在build / bin文件夹中创build一个.cpp文件(我将使用hello.cpp)。 使用标准库头来确保包含path和库正在工作。 从一个非常简单的程序开始。

    (我从什么开始:

     #include <iostream> int main() { std::cout << "hi"; } 

  2. 运行命令clang hello.cpp -std=c++0x -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++" -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++\mingw32" -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../.. -L/mingw/lib -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt

    (-L指定要在其中search库的目录,-l指定要链接的库)(如果没有将MinGW安装到与我相同的path中,可以使用命令“g ++ somefile”查找path。 cpp -v“来让g ++泄露它对库path和库文件以及其他所有选项的使用的胆量在-L和-l选项的输出结尾附近search。注意.o文件与-L相交的名称,Clang使用了许多与g ++相同的选项,所以我从字面上复制并粘贴了g ++的输出)

    这应该编译你的程序并产生一个名为a.out的文件

  3. 将a.out重命名为a.exe或其他

  4. 运行.exe
  5. 你的程序应该运行。

铿锵(3.0)仍然有一些Windows上的问题(我不知道这些问题是否也在Linux上)。 例如,使用-std = c ++ 0x编译一个lambda(铿锵声不支持)会导致clang崩溃并发出诊断错误。 (我被告知LLVM IRC,这是因为clang实现了lambdaexpression式的parsing,而不是语义分析,这是它崩溃的阶段(因为他们忘记了为3.0版本parsinglambdaexpression式),他们已经知道这个BUG)

而且,杰出的Mysticial也同意testing这个指南,并在他的testing中做了一些观察:

  1. Windows标头似乎工作。
  2. 目前只适用于32位。
  3. 64位编译好,但不会组装。
  4. 上证所大概没事。 ([Mysticial还没有]在32位上testing了一个可用的SSE。)

下面是在我的环境中,在Windows 8.1上工作的,总体上类似于Seth的指令,但是用更新的工具。

  1. 我将MinGW 64安装到C:/MinGW ,准确地说,我使用了STL的发行版 。
  2. 我安装了Python 3,只是采取了他们的最新版本。
  3. 我安装了CMake 3.0.2
  4. 我在Github上分支了LLVM和Clang ,并把它们克隆到我的机器上,把Clang的repo放到了llvm \ tools \ clang文件夹中(结构在官方页面中描述,它们只是用svn而不是git来显示)。
  5. 我在“llvm”文件夹旁边创build了“build”文件夹,在“build”文件夹中运行了这个命令: cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm (出于某种原因,CMake无法自动find“make”)
  6. 然后我运行“make”来实际构build。 build设花了几个小时。
  7. 之后,在另一个文件夹中,我创build了1.cpp,它执行一个lambdaexpression式来打印“hi”:
 #include <iostream> int main() { []{ std::cout << "hi"; }(); } 
  1. 我也创build了一个cmd文件来编译cpp。 或者,您可以通过其他方式正确设置PATHvariables。 请注意,MinGW软件包中的GCC vesrion可能会有所不同。 Clang也有一些内置的path,但是它们绑定到特定的GCC版本,而我不在其中,所以我必须明确地提供包含path。
 set PATH=<path to the build folder from step 5>/bin;c:/mingw/bin;%PATH% clang++ -std=c++11 1.cpp -o 1.exe -I"C:/MinGW/include" -I"C:/MinGW/include/c++/4.9.1" -I"C:\MinGW\include\c++\4.9.1\x86_64-w64-mingw32" -I"C:\MinGW\x86_64-w64-mingw32\include" 
  1. 运行该cmd将1.cpp编译成打印“hi”的1.exe。

什么没有工作

  1. 我已经尝试使用VS 2015 CTP中的MSVC编译器构build不使用MinGW + GCC的同样的llvm + clang源代码。 它成功地构build了Clang,唯一的区别是你需要从Developer CMD窗口中执行该操作,并且需要运行cmake -G "Visual Studio 12" ..\llvm ,然后在Visual Studio中编译解决scheme。 但是,Clang未能编译一个示例cpp,它抱怨MinGW标准库头文件中的“未声明的标识符char16_t”和“此目标不支持__int128”。 如果我使用clang-cl和MS STL头文件,它会抱怨“throw x(y)”说明符。 也许我需要为构build提供一些额外的键,但是我无法实现它的工作。

C:\ Program Files文件(x86)\ Microsoft Visual Studio 14.0 \ VC \ include \ xiosbase(293,4):错误:无法编译此throwexpression式_THROW_NCEE(失败,“ios_base :: eofbit设置”); C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ include \ xstddef(56,30):注意:从macros'_THROW_NCEE'扩展#define _THROW_NCEE(x,y)throw x(y)

请参阅http://clang.llvm.org/get_started.html#buildWindows

我用Cmake使用了“Visual Studio 11 Win64”,并使用了当前可用的VS Express for Desktop。

也为lib我使用MinGW-W 64和缺less文件SUA。 http://mingw-w64.sourceforge.net/和http://www.suacommunity.com/

对于由clang ++编译的用于连接W 64二进制文件的.o链接,我使用-m i386pep和ld连接器,这个连接器在W 64交付件中再次出货。

我使用VS构buildLLVM和clang时遇到了很多问题,而且我更喜欢使用Unix用户,我更喜欢使用命令行构build源代码。

按照Seth Carnegie的指示,我使用MinGW v4.5.2使用LLVM v3.3从SVN存储库中build立它,而不是提供的包。