如何在Windows上编译Clang

How to compile Clang on Windows

本文关键字:编译 Clang Windows      更新时间:2023-10-16

我一直在想办法让Clang在Windows上工作,但遇到了麻烦。我让Clang成功编译,但当我试图编译一个程序时,我在标准头中有很多错误。

我知道ruenvb出色的clang预构建版本,但我想自己编译它。我还听了GoingNative关于clang的演讲,说它还没有很好的Windows支持。如何在Windows上运行clang?

我使用以下方法在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(我使用的是ActivePerl 5.14.2 64位)
  4. 获取CMake并将其放在您的PATH中
  5. 转到LLVM下载页面,下载LLVM 3.0源代码和Clang源代码。不要从SVN获取代码,它不适用于MinGW标头
  6. 提取源代码;我在桌面上一个名为llvm-3.0.src的文件夹中有llvm源代码
  7. 将clang源代码直接放在llvm源文件夹内的"tools"文件夹中一个名为"clang"的文件夹中(必须这样称呼它,否则你将构建llvm,但clang不会构建),这应该会使你的目录看起来像:
    • llvm源
      • autoconf文件夹
      • 工具文件夹
        • clang文件夹
          • 绑定文件夹
          • Makefile文件
  8. 在与llvm源文件夹相同的目录中创建一个名为"build"的文件夹
  9. 打开命令行并cd到构建文件夹中
  10. 运行命令cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..llvm-3.0.src

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

    • 这将执行相当于"配置"命令的操作,生成文件和所有内容都将在构建文件夹中生成

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

    • 这将编译llvm和clang,clang可执行文件将在build/bin文件夹中生成
    • 这可能需要很长时间。(你可以尝试通过添加并行构建来加快速度,-j<number>选项)关闭所有其他程序可能会很好,这样你的计算机就可以集中精力,这样它们就不会干扰漫长的编译过程,比如锁定编译器正在写入的文件夹(我也遇到过这种情况)。我甚至关闭了我的防病毒和防火墙软件,这样他们就不会试图扫描生成的文件并挡道

测试的时间到了

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

    (我从开始

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

    )

  2. 运行命令clang hello.cpp -std=c++0x -I"C:MinGWlibgccmingw324.6.1includec++" -I"C:MinGWlibgccmingw324.6.1includec++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++的输出中复制并粘贴了这一行)

    这应该编译你的程序并生成一个名为.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),他们已经知道这个错误)

此外,这位杰出的神秘学家欣然同意测试本指南,并在测试过程中进行了一些观察:

  1. Windows标头似乎可以工作
  2. 目前仅适用于32位
  3. 64位编译良好,但不会进行汇编
  4. SSE可能很好。(尽管Mysticial还没有在32位上测试一个工作的SSE。)

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

  1. 我在C:/MinGW中安装了MinGW64,确切地说,我使用了STL的发行版
  2. 我安装了Python3,只是采用了他们的最新版本
  3. 我安装了CMake 3.0.2
  4. 我在Github上分叉LLVM和Clang,并将它们克隆到我的机器上,将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"; }();
}
  1. 我还创建了一个cmd文件来编译cpp。或者,您可以通过其他方式正确设置PATH变量。请注意,您的MinGW软件包中的GCC vesrion可能有所不同。Clang也尝试了一些内置路径,但它们与特定的GCC版本绑定,而我的不在其中,所以我必须明确地提供include路径
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:MinGWincludec++4.9.1x86_64-w64-mingw32" -I"C:MinGWx86_64-w64-mingw32include"
  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'"answers"此目标不支持__int128"。如果我使用clang cl和MS STL头,它会抱怨"throw x(y)"说明符。也许我需要为构建提供一些额外的密钥,但我无法让它发挥作用

C: \Program Files(x86)\Microsoft Visual Studio14.0\VC\include\xiosbase(293,4):错误:尚未编译此throw表达式_throw_NCEE(失败,"ios_base::eofbit set");C: \Program Files(x86)\Microsoft Visual Studio14.0\VC\include\xstddef(56,30):注意:从宏'_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配合使用。

此外,对于lib,我使用MinGW-W64和丢失的文件SUA。http://mingw-w64.sourceforge.net/和http://www.suacommunity.com/

对于clang++编译的用于W64二进制文件的linking.o,我使用-m i386pep和ld链接器,该链接器再次在W64delivery中提供。

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

根据Seth Carnegie的指示,我使用LLVM v3.3和MinGW v4.5.2从SVN存储库构建了它,而不是提供的包。

Windows上的clang不是独立的,它需要与另一个编译器(如MingWMSVC)组合。

进行上述组合的步骤相当复杂,至少如果你不想错过任何东西的话;构建脚本";值得一整个项目:

https://github.com/mstorsjo/llvm-mingw

我已经测试了llvm-mingw项目的20220906版本(在撰写本文时是最新版本),它将clang 15.0.0MingW无缝结合。

请参阅预构建的二进制版本:
https://github.com/mstorsjo/llvm-mingw/releases

或者尝试一下对我有效的方法:
https://github.com/mstorsjo/llvm-mingw/releases/download/20220906/llvm-mingw-20220906-msvcrt-i686.zip