如何在Windows上编译Clang

Set*_*gie 51 c c++ windows clang

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

我知道rubenvb的优秀预装版本的clang,但我想为自己编译它.我也在听GoingNative谈论clang,它说它还没有很好的Windows支持.我如何让Windows在Windows上工作?

Set*_*gie 56

我使用以下方法在Windows 7上为C++编译clang,并且已经由Mysticial和其他人验证:

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

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

    • 这将相当于"configure"命令,makefile和所有内容都将在build文件夹中生成

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

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

是时候测试一下了

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

    (我的开头:

    #include <iostream>
    
    int main() {
        std::cout << "hi";
    }
    
    Run Code Online (Sandbox Code Playgroud)

    )

  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指定要在其中搜索库的目录,-l指定要链接的库)(如果没有将MinGW安装到与我相同的路径,则可以使用命令"g ++ somefile"找到路径. cpp -v"让g ++泄漏其关于库路径和库文件使用的选项以及其他所有选项的内容.在输出结尾附近搜索-L和-l选项.请注意.o文件用-L's散布的名字.Clang使用许多与g ++相同的选项,所以我从g ++的输出中复制并粘贴了那一行

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

  3. 将a.out重命名为a.exe或其他任何内容

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

Clang(3.0)在Windows上仍有一些问题(我不知道这些问题是否也出现在linux上).例如,使用-std = c ++ 0x编译lambda(clang不支持)将导致clang崩溃并发出诊断错误.(我在LLVM IRC上被告知这是因为clang实现了对lambdas的解析而不是语义分析,这是崩溃的阶段(因为他们忘了禁用解析3.0版本的lambdas),并且他们已经知道这个BUG)

此外,杰出的Mysticial友好地同意测试本指南,并在测试期间做了一些观察:

  1. Windows标头似乎工作.
  2. 目前仅适用于32位.
  3. 64位编译好,但不会组装.
  4. SSE可能很好.([Mysticial没有]测试32位工作SSE.)

  • Clang现在支持lambda,但仅限于SVN版本.使用lambdas时总会崩溃,即使在Mac OS X上也是如此. (2认同)

Max*_*kin 5

这里是什么工作在我的环境中,在Windows 8.1,整体类似于Seth的指令,但新鲜的工具.

  1. 我安装了MinGW 64 C:/MinGW,准确地说我使用过STL的发行版.
  2. 我安装了Python 3,刚拿了他们的最新版本.
  3. 我安装了CMake 3.0.2
  4. 我在Github上分叉LLVMClang并将它们克隆到我的机器上,将Clang的repo放入llvm\tools\clang文件夹(该结构在官方页面上描述,它们只显示svn而不是git的示例).
  5. 我在"llvm"文件夹旁边创建了"build"文件夹,并在"build"文件夹中运行了这个命令:( cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm 由于某种原因,CMake无法自动找到"make")
  6. 然后我跑了"make"来实际构建.构建花了几个小时.
  7. 之后在另一个文件夹中我创建了1.cpp,它执行一个lambda表达式来打印"hi":
#include <iostream>

int main() {
    []{ std::cout << "hi"; }();
}
Run Code Online (Sandbox Code Playgroud)
  1. 我还创建了一个cmd文件来编译cpp.或者,您可以通过其他方式正确设置PATH变量.请注意,MinGW包中的GCC vesrion可能不同.Clang还有一些内置的路径,但它们与特定的GCC版本绑定,而我的不在其中,因此我必须明确提供包含路径.
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"
Run Code Online (Sandbox Code Playgroud)
  1. 运行该cmd将1.cpp编译成打印"hi"的1.exe.

什么行不通:

  1. 我尝试使用VS 2015 CTP的MSVC编译器在没有MinGW + GCC的情况下构建相同的llvm + clang源.它成功构建了Clang,唯一的区别是你需要在Developer CMD窗口中执行此操作,并且需要cmake -G "Visual Studio 12" ..\llvm在Visual Studio中运行 然后编译解决方案.但是,Clang无法编译样本cpp,它在MinGW标准库头中抱怨"未声明的标识符'char16_t'"和"此目标不支持__int128".如果我使用clang-cl和MS STL头文件,则会抱怨"throw x(y)"说明符.也许我需要为构建提供一些额外的密钥,但我无法让它工作.

C:\ Program Files(x86)\ Microsoft Visual Studio 14.0\VC\include\xiosbase(293,4):错误:无法编译此throw表达式_THROW_NCEE(失败,"ios_base :: eofbit set"); C:\ Program Files(x86)\ Microsoft Visual Studio 14.0\VC\include\xstddef(56,30):注意:从宏'_THROW_NCEE扩展'#define _THROW_NCEE(x,y)throw x(y)