What do you need to install to use Clang on windows to build c++14 for 64 bit?
更新:
我编写了详细的教程,其中包含有关此问题的前两个答案:http://blog.johannesmp.com/2015/09/01/installing-clang-on-windows-pt1/
TL; DR
在Windows上,给定以下程序:
1 2 3 4 5 6 7 8 9 10 11
| #include <iostream>
int main()
{
int arr[] = {1, 2, 3, 4, 5};
for(auto el : arr)
{
std::cout << el << std::endl;
}
return 0;
} |
我希望能够执行以下操作:
1
| clang++ hello.cpp -o hello.exe -std=c++14 |
并获得一个可以正常工作的64位可执行文件。我不想附加大量的-I包含项来告诉clang在哪里可以找到iostream或其他标准c ++头文件;我不想链接多个步骤。
我不太在乎性能,效率,使用了什么链接器等。我只想能够正确设置clang / gcc /任何内容,以便可以使用单个,快速且肮脏的控制台命令,例如以上之一。
我需要安装什么才能正常工作?
问题
作为主要的mac / linux用户,我习惯于仅使用软件包管理器来安装最新版本的clang,该方法才有效。
我现在正在尝试在Windows上设置clang / gnu编译器,这似乎要困难得多,如果仅仅是因为那里几乎没有甚至没有直接的文档(我已经能够找到)
我尝试遵循此教程:https://yongweiwu.wordpress.com/2014/12/24/installing-clang-3-5-for-windows-并能够使用它来获取clang的构建和链接(使用gcc 4.8.2),但生成的二进制文件为32位。
我试过安装最新的clang预编译二进制文件(3.6.2)和mingw-w64的64位版本(4.9.3为posix和sjlj为64位,例外),并且正在获取:
1 2 3 4
| hello.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
^
1 error generated. |
这似乎表明clang没有看到gcc的文件。似乎某些版本的LLVM / clang只是在寻找某些版本的gcc,但这似乎没有记录在任何地方?
类似地,有人在LLVM IRC上对我说过,您需要修改clang的驱动程序以在某些路径中查找gcc?
我在寻找什么
我可以根据需要从源代码构建LLVM / Clang,但我实际上只是在寻找清晰的分步说明,使我能够像使用mac /一样轻松地使用clang++ linux
就像是:
构建LLVM / Clang的this version并将其放置在that directory中
下载并安装cygwin的this version(或mingw32或mingw-w64)并安装these packages。
等等..
-
另请参见github.com/boostorg/hana/wiki/Setting-up-Clang-on-Windows
尝试安装MSYS2,然后安装mingw-w64-x86_64-clang(二进制)程序包:
1
| pacman -S mingw-w64-x86_64-clang |
目前(3.6.2)有点旧,但对于您来说可能已经足够了。然后,当您运行MSYS2提供的Win64 Shell时,clang将在您的路径上。
如果还不够好,我最近就用MSYS2构建了一个64位的clang版本,并用它来编译本机的64位Windows可执行文件。我的过程是这样的:
使用pacman安装base-devel,mingw-w64-x86_64-ninja,mingw-x86_64-cmake以及构建过程可能需要的其他一些软件包。
抓取我的PKGBUILD脚本以获取clang和同一目录中的文件。这是基于MSYS2的mingw-w64-clang-svn软件包的,这主要是Martell Malone所做的工作。您可以在MSYS2 IRC频道上找到他,并向他询问更多信息。
在Win64 Shell中,使用我的PKGDUILD转到目录,运行export MINGW_INSTALLS=mingw64(因此您仅编译64位版本),然后运行makepkg-mingw。
您不太可能在首次尝试时就能正确处理所有问题,并且可能需要编辑某些文件。自从我上次执行此操作以来,Clang可能已更改,并且某些补丁可能无法完全应用。
-
有趣。我会试一试。 MSYS2是像brew / apt-get这样的软件包管理器吗?我以前没有听说过。
-
MSYS2是在Windows上进行软件开发的环境,它确实具有程序包管理器(pacman)。这很棒!
-
好的,我尝试安装它并运行您提到的第一个命令。我收到了很多404:i.imgur.com/DVKtj74.png有什么想法吗?
-
您的包裹数据库可能已过期;如今,MSYS2使用gcc 5.2.0。请尝试按照sourceforge.net/p/msys2/wiki/MSYS2%20installation中的"更新软件包"说明进行操作
-
我已经更新了我的软件包,成功运行了pacman -S mingw-w64-x86_64-clang,并且能够根据需要构建该exe。它可以从mingw64 shell内部正常运行,但是当我尝试从Windows资源管理器中打开exe时,我得到了几个丢失的dll。我记得在Linux服务器上设置mingw32来编译exe时,一种解决此问题的方法是静态链接相应dll的库。有没有一种方法可以自动执行而无需添加-static-libstdc++等?同样,这里为了简单起见。我意识到,在较大的项目中,您只能将其包含在MAKE文件中。
-
经过一些搜索后,这里的问题:stackoverflow.com/a/14033674/928062回答了它。可能会提供-static标志,并且编译器将在可能的情况下尝试包含库。我知道这是以增加可执行文件大小和可能的内存使用为代价的,但这是可以接受的。
-
将所需的运行时DLL复制到与可执行文件相同的目录中是让其运行的另一种方法。
-
是的还应注意(如果仅供以后阅读的参考),库的动态链接不仅限于MSYS2的可执行文件,而且还会影响如上所述使用clang 3.7.0构建的可执行文件(Im很可能会坚持下去,因为它也可以与32位一起使用)。无论如何,非常感谢大卫的帮助。由于其简单性,我选择了其他答案,但将来肯定会使用msys2。
-
MSYS2也具有32位clang。只需安装mingw-w64-i686-clang并运行Win32 shell
-
让我们继续聊天中的讨论。
-
pacman -S mingw-w64-x86_64-clang和pacman -S clang有什么区别?我看到了两个不同的名称和版本,但我无法完全确定它从何处获得c声
-
第一个clang本身就是Windows本机程序,位于mingw64中。后者可能是一个msys2程序(使用MSYS2 POSIX仿真的东西,并取决于msys-2.0.dll),并位于/ usr / bin中。每种版本的clang都可能配置为针对clang本身使用的同一运行时生成可执行文件,但是我不太确定,我知道一种clang版本可以针对多个平台。所有官方MSYS2软件包的配方都在这两个仓库中:github.com/AlexPux/MINGW-packages github.com/AlexPux/MSYS2-packages
-
他们为什么不能仅将其称为clang?
-
如果您引用的是MSYS2软件包名称,则所有在MinGW运行时中运行的MSYS2软件包都以mingw-w64为前缀。这就是他们如何保持包裹井井有条的方式。
如果您使用即将到来的clang 3.7.0,只需将PATH设置为包含mingw-w64的bin,clang就可以按预期工作
-
谢谢!我从此处的预发行版页面下载了clang 3.7.0:llvm.org/pre-releases/3.7.0,并安装了4.9.3版本的mingw-w64:sourceforge.net/projects/mingw-w64/files/,确保两者都在路径上有它们的bin目录,并且可以正常工作! i.imgur.com/E1XKaeY.png
-
我最终安装了clang 3.7.0和mingw-w64的64位和32位版本(版本5.1.0,带有seh例外的posix线程(适用于64位)和dwarf例外(适用于32位)。我将它们放在默认位置,仅将64位版本放在路径上。然后,我制作了两个批处理文件,以便在需要时将32位版本临时添加到路径:gist.github.com/JohannesMP/1e7ed200367460255971-例如,当使用仅支持32位可执行文件的drmemory时。这很好用,我可以在32位和64位中编译和链接clang / gcc。
您可以在此处为Windows安装llvm预发行二进制文件。 MinGW-w64可以在这里下载。当然,您应该确保正确设置路径。
对于最新版本的clang,例如clang 6.0.0。 @ user5271266的上述解决方案还不够。现在,铛Windows的默认目标是x86_64-pc-windows-msvc(假设您使用的是64位Windows)。
为了编译C ++源文件,根据这里,我们应该更改目标:
1
| clang++ -target x86_64-pc-windows-gnu -std=c++14 test.cc -o test.exe |
-
除了在系统路径上包含CLang之外,CMake识别Clang还需要哪些系统变量?
-
我没有CMake的经验。因此,恐怕您必须提出一个新问题或搜索现有问题。
-
CMake只是寻找CLang添加到Windows系统的默认系统变量安装。这些是什么?
-
我只是手动将LLVM可执行路径添加到系统PATH变量中,例如d:\\Program Files\\LLVM\\bin。