如何在Windows上编译Clang
How to compile Clang on Windows
我一直在想办法让Clang在Windows上工作,但遇到了麻烦。我让Clang成功编译,但当我试图编译一个程序时,我在标准头中有很多错误。
我知道ruenvb出色的clang预构建版本,但我想自己编译它。我还听了GoingNative关于clang的演讲,说它还没有很好的Windows支持。如何在Windows上运行clang?
我使用以下方法在Windows 7上为C++编译clang,它已经过Mysticial和其他人的验证:
- 下载并安装MinGW(确保安装了C++编译器),并将bin文件夹放在PATH中(我有MinGW 4.6.1,并在另一台带有4.6.2的计算机上成功测试)
- 确保您的PATH中有Python(而不是3,我有2.7)
- (可选:确保PATH中有Perl(我使用的是ActivePerl 5.14.2 64位)
- 获取CMake并将其放在您的PATH中
- 转到LLVM下载页面,下载LLVM 3.0源代码和Clang源代码。不要从SVN获取代码,它不适用于MinGW标头
- 提取源代码;我在桌面上一个名为llvm-3.0.src的文件夹中有llvm源代码
- 将clang源代码直接放在llvm源文件夹内的"tools"文件夹中一个名为"clang"的文件夹中(必须这样称呼它,否则你将构建llvm,但clang不会构建),这应该会使你的目录看起来像:
- llvm源
- autoconf文件夹
- 工具文件夹
- clang文件夹
- 绑定文件夹
- Makefile文件
- clang文件夹
- llvm源
- 在与llvm源文件夹相同的目录中创建一个名为"build"的文件夹
- 打开命令行并cd到构建文件夹中
-
运行命令
cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..llvm-3.0.src
-
(最后一个参数是包含llvm源文件的文件夹的相对路径(以及tools/crang子目录中的clang源文件)
-
这将执行相当于"配置"命令的操作,生成文件和所有内容都将在构建文件夹中生成
- 这需要几分钟时间
-
-
运行命令
mingw32-make
- 这将编译llvm和clang,clang可执行文件将在build/bin文件夹中生成
- 这可能需要很长时间。(你可以尝试通过添加并行构建来加快速度,
-j<number>
选项)关闭所有其他程序可能会很好,这样你的计算机就可以集中精力,这样它们就不会干扰漫长的编译过程,比如锁定编译器正在写入的文件夹(我也遇到过这种情况)。我甚至关闭了我的防病毒和防火墙软件,这样他们就不会试图扫描生成的文件并挡道
测试的时间到了
-
在build/bin文件夹中创建一个.cpp文件(我将使用hello.cpp)。使用标准库头来确保include路径和库正常工作。从一个非常简单的程序开始。
(我从开始
#include <iostream> int main() { std::cout << "hi"; }
)
-
运行命令
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 的文件
-
将a.out重命名为a.exe或其他
- 运行.exe
- 您的程序应该运行
Clang(3.0)在Windows上仍然存在一些问题(我不知道这些问题是否也在linux上)。例如,使用-std=c++0x编译lambda(clang不支持)会导致clang崩溃并发出诊断错误。(我在LLVM IRC上被告知,这是因为clang实现了对lambdas的解析,但没有实现语义分析,这是它崩溃的阶段(因为他们忘记为3.0版本禁用解析lambdas),他们已经知道这个错误)
此外,这位杰出的神秘学家欣然同意测试本指南,并在测试过程中进行了一些观察:
- Windows标头似乎可以工作
- 目前仅适用于32位
- 64位编译良好,但不会进行汇编
- SSE可能很好。(尽管Mysticial还没有在32位上测试一个工作的SSE。)
以下是在我的Windows 8.1环境中的工作原理,总体上类似于Seth的指令,但使用了更新鲜的工具。
- 我在
C:/MinGW
中安装了MinGW64,确切地说,我使用了STL的发行版 - 我安装了Python3,只是采用了他们的最新版本
- 我安装了CMake 3.0.2
- 我在Github上分叉LLVM和Clang,并将它们克隆到我的机器上,将Clang的repo放在LLVM\tools\Clang文件夹中(结构在官方页面上描述,它们只是用svn而不是git显示示例)
- 我在"llvm"文件夹旁边创建了"build"文件夹,并在"build"文件夹中运行以下命令:
cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..llvm
(由于某种原因,CMake无法自动找到"make") - 然后我运行"make"来实际构建。建造花了几个小时
- 之后,我在另一个文件夹中创建了1.cpp,它执行lambda表达式来打印"hi":
#include <iostream> int main() { []{ std::cout << "hi"; }(); }
- 我还创建了一个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"
- 运行该cmd将1.cpp编译为打印"hi"的1.exe
什么不起作用:
- 我尝试过使用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
不是独立的,它需要与另一个编译器(如MingW
或MSVC
)组合。
进行上述组合的步骤相当复杂,至少如果你不想错过任何东西的话;构建脚本";值得一整个项目:
https://github.com/mstorsjo/llvm-mingw
我已经测试了llvm-mingw
项目的20220906版本(在撰写本文时是最新版本),它将clang 15.0.0
和MingW
无缝结合。
请参阅预构建的二进制版本:
https://github.com/mstorsjo/llvm-mingw/releases或者尝试一下对我有效的方法:
https://github.com/mstorsjo/llvm-mingw/releases/download/20220906/llvm-mingw-20220906-msvcrt-i686.zip
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- clang 插件:在编译过程中修改 AST
- 错误:使用 clang 没有可行的重载,使用 GCC 编译
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 通过自制软件(macOS)安装的clang++:编译错误
- 在使用 Clang 编译 DLL 时指定 DEF 文件
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何在 clang 的自动会议中检查支持编译标志
- constexpr 使用 clang 编译 TensorFlow 时出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 如何更改 clang 的预编译头文件的路径
- 除了说明符神秘地破坏编译(Clang,GCC不同意)
- VS 代码显示编译 clang 的错误消息
- 同一段代码,可以用 xcode 或使用 g++ 编译,在终端中编译 clang++,不能使用 gcc 或 clang 编
- 简单的 constexpr 函数无法使用 GCC 编译(clang 没问题)
- 在 C++14 模式下为 libstdc++ 编译 clang 正则表达式程序会导致错误
- 如何在Windows上编译Clang
- 在Windows中编译Clang插件
- 是否可以在内存中使用Clang c++ API编译Clang源代码?