如何在Windows上编译Clang

55

我一直在尝试让Clang在Windows上工作,但是遇到了麻烦。我可以成功编译Clang,但是当我尝试编译程序时,在标准头文件中出现了一堆错误。

我知道rubenvb的优秀预构建版本,但我想自己编译。我也听了关于clang的GoingNative讲座,其中提到它在Windows上的支持还不太好。我该如何在Windows上让clang正常工作?


2
预编译的 Windows clang:http://sourceforge.net/projects/clangonwin/ - Angelus Mortis
对于任何需要的人,我发现这些指南非常简单明了。那里只有4个步骤。这里是链接。 - KeyC0de
5个回答

60

我使用以下方法在Windows 7上为C++编译clang,并得到了Mysticial和其他人的验证:

  1. 下载并安装MinGW(确保你安装了C++编译器),将bin文件夹添加到环境变量中(我使用的是MinGW 4.6.1,另一台电脑上测试成功的是4.6.2)。
  2. 确保Python在环境变量中(不是3,我用的是2.7)。
  3. (可选)确保Perl在环境变量中(我使用了ActivePerl 5.14.2 64位版本)。
  4. 获取CMake并将其添加到环境变量中。
  5. 访问LLVM下载页面,下载LLVM 3.0源代码以及Clang源代码。不要从SVN获取代码,因为它与MinGW头文件不兼容。
  6. 解压缩源代码;我将llvm源代码放在桌面的一个名为“llvm-3.0.src”的文件夹中。
  7. 将clang源代码直接放在名为“clang”的文件夹中(必须精确命名为这个,否则你将会构建llvm但不会构建clang),“clang”文件夹应该位于llvm源代码文件夹内的“tools”文件夹中,这样你的目录结构应该如下所示:
    • llvm源代码
      • autoconf文件夹
      • ...
      • tools文件夹
        • ...
        • clang文件夹
          • bindings文件夹
          • ...
          • Makefile文件
          • ...
        • ...
      • ...
  8. 在与llvm源代码文件夹相同的目录中创建一个名为“build”的文件夹。
  9. 打开命令行并进入build文件夹。
  10. 运行命令cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src

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

    • 这将执行相当于“configure”命令的操作,并在build文件夹中生成makefiles和其他一切内容。

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

    • 这将编译llvm和clang,并在build/bin文件夹中生成clang可执行文件。
    • 这可能需要很长时间。(你可以尝试添加并行构建,使用 -j<number> 选项来加速)。最好关闭所有其他程序,这样你的电脑可以专注于编译过程,而不会干扰它,比如在编译器正在写入的文件夹上放一个锁(我的情况就是这样)。我甚至关闭了杀毒软件和防火墙软件,以免它们尝试扫描生成的文件并干扰编译过程。

现在是时候测试一下了

  1. 在build/bin文件夹中

    #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. 将a.out重命名为a.exe或其他名称

  4. 运行.exe文件
  5. 程序应该能够执行。

在Windows上,Clang(3.0)仍然存在一些问题(我不知道这些问题是否也存在于linux上)。例如,使用-std=c++0x编译lambda表达式(clang不支持)将导致clang崩溃并发出诊断错误。 (LLVM IRC告诉我,这是因为clang实现了lambda的解析但没有语义分析阶段,这就是它崩溃的阶段(因为他们忘记在3.0版中禁用解析lambda),并且他们已经知道此漏洞)

此外,在测试期间,Mysticial先生进行了一些观察:

  1. Windows头文件似乎可行。
  2. 目前仅适用于32位。
  3. 64位可以编译,但无法汇编。
  4. SSE可能没问题。([Mysticial还没有]在32位上测试过一个工作的SSE。)

2
Clang现在支持lambda,尽管只有SVN版本支持。 在使用lambda时它总是崩溃,即使在Mac OS X上也是如此。 - user1203803
我设法编译了一些源代码,但对于某些源代码,编译器会卡住。 - Aftershock
@Aftershock 如果你只想使用clang,那么你可能需要使用rubenvb的预打包版本,它们比3.0更新。 - Seth Carnegie
在我的测试中,使用OS X上的trunk clang,lambda函数实际上运行得非常好。甚至有些lambda函数在Xcode 4.3版本的clang中也可以工作,但崩溃并不罕见。 - bames53
它能在他们目前发布的新版本 LLVM 8.0.1 上工作吗?我尝试了相同的方法,但是出现了错误 https://stackoverflow.com/questions/58303123/how-to-build-clang-with-mingw-on-winodws。请告诉我是否有任何可用的解决方案来解决这个错误。 - Jon marsh

5
这是我在Windows 8.1环境下的实践经验,与Seth的指导基本相似,但使用了更新的工具。
  1. 我将MinGW 64安装到了C:/MinGW,准确地说,我使用了STL的发行版
  2. 我安装了Python 3,只是选择了他们的最新版本。
  3. 我安装了CMake 3.0.2
  4. 我在Github上fork了LLVMClang,并将它们克隆到我的机器上,将Clang的存储库放置在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"; }();
}
我还创建了一个cmd文件来编译cpp。或者你可以通过其他方式正确设置PATH变量。请注意,您的MinGW软件包中的GCC版本可能不同。此外,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"
  1. 运行该命令将1.cpp编译成1.exe并打印“hi”。

未成功的尝试:

  1. 我曾尝试使用VS 2015 CTP自带的MSVC编译器,而非MinGW+GCC编译相同的llvm+clang源码。Clang编译成功了,唯一的区别是你需要在开发者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表达式yet _THROW_NCEE(failure, "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)


1
这基本上就是我上次所做的。你有检查过这一切在CygWin下的兼容性吗?明年我需要一个带clang的Windows环境。这一次,我打算主要使用CygWin,因为它具有诸如CygWin/X等功能。 - polemon
@polemon,抱歉,我没有安装Cygwin,并且我也没有尝试过在其上使用clang。 - Massimiliano
@polemon 我刚试了一下。然而,CMake无法在llvm内的tools子目录中找到文件,因为针对cmake的文件路径生成了一个隐藏的“cygdrive/c/”,而Cygwin以某种方式劫持了文件系统。我使用了来自CMake网站的二进制文件。使用随Cygwin附带的cmake会给出“Could not create named generator MinGW Makefiles”。我仍在尝试寻找解决方案。请注意,Cygwin中有32位端口,但如果您的程序倾向于进行数值计算等操作,则从中运行的可执行文件性能较差。 - CloudyTrees
我做了完全相同的事情,但它出现了错误,我找不到任何解决方案。https://stackoverflow.com/questions/58303123/how-to-build-clang-with-mingw-on-winodws - Jon marsh

2

你使用了VS Express for Desktop吗?它没有要求atlbase.h文件吗? - Jon marsh

0

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

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


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - hivert
谢谢,我会记住的。 - Jacob Lärfors
我尝试了所有的选项,但它仍然抛出错误,我找不到任何解决方案。我在这里发布评论,因为至少我会从任何一个构建它的人那里得到答案。请查看这个错误:https://stackoverflow.com/questions/58303123/how-to-build-clang-with-mingw-on-winodws。 - Jon marsh

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接