我一直在尝试让Clang在Windows上工作,但是遇到了麻烦。我可以成功编译Clang,但是当我尝试编译程序时,在标准头文件中出现了一堆错误。
我知道rubenvb的优秀预构建版本,但我想自己编译。我也听了关于clang的GoingNative讲座,其中提到它在Windows上的支持还不太好。我该如何在Windows上让clang正常工作?
我一直在尝试让Clang在Windows上工作,但是遇到了麻烦。我可以成功编译Clang,但是当我尝试编译程序时,在标准头文件中出现了一堆错误。
我知道rubenvb的优秀预构建版本,但我想自己编译。我也听了关于clang的GoingNative讲座,其中提到它在Windows上的支持还不太好。我该如何在Windows上让clang正常工作?
我使用以下方法在Windows 7上为C++编译clang,并得到了Mysticial和其他人的验证:
运行命令cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src
(最后一个参数是包含llvm源代码(以及tools/clang子目录中的clang源代码)的文件夹的相对路径)
这将执行相当于“configure”命令的操作,并在build文件夹中生成makefiles和其他一切内容。
运行命令mingw32-make
-j<number>
选项来加速)。最好关闭所有其他程序,这样你的电脑可以专注于编译过程,而不会干扰它,比如在编译器正在写入的文件夹上放一个锁(我的情况就是这样)。我甚至关闭了杀毒软件和防火墙软件,以免它们尝试扫描生成的文件并干扰编译过程。现在是时候测试一下了
在build/bin文件夹中
#include <iostream>
int main() {
std::cout << "hi";
}
)
运行命令 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的文件
将a.out重命名为a.exe或其他名称
在Windows上,Clang(3.0)仍然存在一些问题(我不知道这些问题是否也存在于linux上)。例如,使用-std=c++0x编译lambda表达式(clang不支持)将导致clang崩溃并发出诊断错误。 (LLVM IRC告诉我,这是因为clang实现了lambda的解析但没有语义分析阶段,这就是它崩溃的阶段(因为他们忘记在3.0版中禁用解析lambda),并且他们已经知道此漏洞)
此外,在测试期间,Mysticial先生进行了一些观察:
C:/MinGW
,准确地说,我使用了STL的发行版。cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm
(由于某种原因,CMake无法自动找到"make")
#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"
未成功的尝试:
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)
参考http://clang.llvm.org/get_started.html#buildWindows
我使用了“Visual Studio 11 Win64”和cmake,目前可用的VS Express for Desktop也可以正常工作。
此外,我使用MinGW-W 64作为lib,缺少文件则使用SUA。http://mingw-w64.sourceforge.net/和http://www.suacommunity.com/
为了将clang++编译的.o文件链接到W 64二进制文件中,我使用-m i386pep和ld链接器,这些都包含在W 64可交付文件中。
我在使用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