我一直试图找到一种方法让Clang在Windows上运行但遇到了麻烦。我让Clang成功编译,但是当我尝试编译程序时,标准头文件中出现了一堆错误。
我知道rubenvb's excellent prebuilt versions of clang,但我想自己编译。我也在听GoingNative谈论clang,它说它还没有很好的Windows支持。如何在Windows上使用clang?
答案 0 :(得分:55)
我使用以下方法在Windows 7上为C ++编译clang,并且已经被Mysticial和其他人验证过:
运行命令cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src
(最后一个参数是其中包含llvm源的文件夹的相对路径(以及tools / clang子目录中的clang源))
这将相当于“configure”命令,makefile和所有内容都将在构建文件夹中生成
运行命令mingw32-make
-j<number>
选项)关闭所有其他程序可能会很好,这样您的计算机就可以集中精力,因此它们不会干扰冗长的编译过程,例如将锁定放在编译器正在写入的文件夹上(它发生在我身上)。我甚至关闭了我的防病毒软件和防火墙软件,这样他们就不会尝试扫描生成的文件并妨碍我们。测试时间
在build / bin文件夹中创建一个.cpp文件(我将使用hello.cpp)。使用标准库头来确保包含路径和库正常工作。从一个非常简单的程序开始。
(我的开头:
#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或其他
Clang(3.0)在Windows上仍有一些问题(我不知道这些问题是否也在linux上)。例如,使用-std = c ++ 0x编译lambda(clang不支持)将导致clang崩溃并发出诊断错误。 (我在LLVM IRC上被告知这是因为clang实现了对lambdas的解析而不是语义分析,这是崩溃的阶段(因为他们忘了禁用解析3.0版本的lambdas),并且他们已经知道这个缺陷)
此外,杰出的神秘主义者同意测试本指南,并在测试过程中提出一些意见:
答案 1 :(得分:5)
以下是在我的环境中运行,在Windows 8.1上,总体上类似于Seth的指令,但使用了更新的工具。
C:/MinGW
,确切地说我使用了STL's distro。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"; }(); }
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表达式_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存储库而不是提供的包构建它。