如何在Windows上编译Clang

时间:2012-02-24 08:04:31

标签: c++ c windows clang

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

我知道rubenvb's excellent prebuilt versions of clang,但我想自己编译。我也在听GoingNative谈论clang,它说它还没有很好的Windows支持。如何在Windows上使用clang?

4 个答案:

答案 0 :(得分:55)

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

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

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

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

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

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

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

      (我的开头:

      #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指定搜索库的目录,-l指定要链接的库) (如果你没有像我一样安装MinGW路径,你可以找到带有命令“g ++ somefile.cpp -v”的路径,让g ++了解它用于库路径的选项。和库文件以及其他所有内容 在输出结尾附近搜索-L和-l选项。请注意散布在-L中的.o文件名。 Clang使用了很多与g ++相同的选项,所以我从g ++的输出中复制并粘贴了这一行。

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

    3. 的文件
    4. 将a.out重命名为a.exe或其他

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

      此外,杰出的神秘主义者同意测试本指南,并在测试过程中提出一些意见:

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

答案 1 :(得分:5)

以下是在我的环境中运行,在Windows 8.1上,总体上类似于Seth的指令,但使用了更新的工具。

  1. 我将MinGW 64安装到C:/MinGW,确切地说我使用了STL's distro
  2. 我安装了Python 3,刚刚使用了他们的最新版本。
  3. 我安装了CMake 3.0.2
  4. 我在Github上分叉LLVMClang并将它们克隆到我的机器上,将Clang的repo放入llvm \ tools \ clang文件夹(结构描述为on the official page,它们只显示示例用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”:
  8. #include <iostream>
    
    int main() {
        []{ std::cout << "hi"; }();
    }
    
    1. 我还创建了一个cmd文件来编译cpp。或者,您可以通过其他方式正确设置PATH变量。请注意,MinGW包中的GCC vesrion可能不同。 Clang还有一些内置的路径,但它们与特定的GCC版本绑定,而我的不在其中,因此我必须明确提供包含路径。
    2. 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。
      2. 无效

        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)”说明符。也许我需要为构建提供一些额外的密钥,但我无法让它工作。
        2.   

          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)

答案 2 :(得分:2)

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

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

同样对于lib我使用MinGW-W 64 和丢失的文件SUA。 http://mingw-w64.sourceforge.net/http://www.suacommunity.com/

对于链接由.cng ++编译的.o用于W 64 二进制文件,我使用-m i386pep和ld链接器再次在W 64 可交付物中发布。

答案 3 :(得分:0)

我在使用VS构建LLVM和clang时遇到了很多问题,并且作为Unix用户我更喜欢从命令行构建源代码。

按照Seth Carnegie的说明,我使用LLVM v3.3和MinGW v4.5.2从SVN存储库而不是提供的包构建它。