在 Windows 上使用 libc++?

Posted

技术标签:

【中文标题】在 Windows 上使用 libc++?【英文标题】:Use libc++ on Windows? 【发布时间】:2015-01-04 11:05:38 【问题描述】:

libc++ 是否支持在 Clang/LLVM 作为本机的 Windows 上被引用/包含和编译?对于本地人,我的意思是不依赖 mingw 和 cygwin。我没有找到太多关于此的文档,但我相信它应该得到支持,因为 Windows 的 clang 已经发布了很长时间。

【问题讨论】:

可能不会。大约一年前我已经尝试过了,由于缺乏异常支持,在编译 libc++-abi 时遇到了很多麻烦。 我一直在努力让 Clang 也能在 Windows 上工作。 Clang for Windows 已经以现成的 windows 安装包的形式发布,请参阅here。如果我没记错的话,它需要 MSVC 的链接器和 stdlib,这就是我不使用它的原因。 【参考方案1】:

只是一个更新。现在(2018 年初)有实验性支持:

https://libcxx.llvm.org/docs/BuildingLibcxx.html#experimental-support-for-windows

(来自链接)

假设你有 Ninja,并且 libcxx/llvm 都已检出,libcxx 可以通过

> cmake -G Ninja                                                                    ^
        -DCMAKE_MAKE_PROGRAM=/path/to/ninja                                         ^
        -DCMAKE_SYSTEM_NAME=Windows                                                 ^
        -DCMAKE_C_COMPILER=clang-cl                                                 ^
        -DCMAKE_C_FLAGS="-fms-compatibility-version=19.00 --target=i686--windows"   ^
        -DCMAKE_CXX_COMPILER=clang-cl                                                ^
        -DCMAKE_CXX_FLAGS="-fms-compatibility-version=19.00 --target=i686--windows" ^
        -DLLVM_PATH=/path/to/llvm/tree                                              ^
        -DLIBCXX_ENABLE_SHARED=YES                                                  ^
        -DLIBCXX_ENABLE_STATIC=NO                                                   ^
        -DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=NO                                     ^
        \path\to\libcxx
> /path/to/ninja cxx
 

从 2018 年 4 月 23 日起,即使针对 x86-64 编译,它也会安装到 Program Files (x86) 中...(可以通过在上面将 i686 更改为 x86_64 来完成)。

2020 年 11 月更新:我现在使用一个名为 llvm-mingw 的包。

该软件包包括带有包装器的 clang 编译器工具链,以支持各种 gcc 样式的可执行文件(例如 gcc.exe、g++.exe、x86_64-w64-mingw32-gcc.exe),并且可以开箱即用地针对mingw libc++(你不必单独安装mingw,mingw库随包一起提供)。

llvm-mingw 还很年轻,但具有 mingw-w64 的大部分功能。未实现的功能有:

lld 链接到 dll(这是 gnu ld 的一个特性,但不是 llvm 实现) 没有用于 lldb 的 python 包装器,因此许多 IDE 无法使用调试器。 Visual Studio Code 似乎有它自己的链接,因此 LLDB 可以与 VS Code 一起使用。人们现在正在为此努力。

作者的 github 存储库中提供了版本。我的winlua.net 站点上有一个二进制安装程序。

【讨论】:

欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted. 太棒了!谢谢@IronManMark20【参考方案2】:

通过将LLVM_FORCE_BUILD_RUNTIME cmake 的变量设置为ON,可以在Windows 中构建和安装libc++clang。这是一个例子:

cmake -Wno-dev -G Ninja
    -DCMAKE_INSTALL_PREFIX=c:\clang
    -DLLVM_ENABLE_Z3_SOLVER=ON
    -DLLVM_ENABLE_PROJECTS='clang;clang-tools-extra;compiler-rt;libcxx;lld'
    -DLLVM_FORCE_BUILD_RUNTIME=ON
    -DCMAKE_BUILD_TYPE=Release
    -DCMAKE_C_COMPILER=clang-cl
    -DCMAKE_CXX_COMPILER=clang-cl
    -DCMAKE_CXX_FLAGS='/DWIN32 /D_WINDOWS /W3 /GS- /GR /EHsc /D_CRT_SECURE_NO_DEPRECATE /D_SECURE_SCL_DEPRECATE=0 /D_SECURE_SCL=0 /D_HAS_ITERATOR_DEBUGGING=0 /DSTRSAFE_NO_DEPRECATE'
    -DCMAKE_CXX_FLAGS_RELEASE='/MD /clang:-march=native /clang:-mtune=native /clang:-O3 /clang:-g0 /DNDEBUG'
    -DCMAKE_C_FLAGS='/GS- /DWIN32 /D_WINDOWS /W3 /D_CRT_SECURE_NO_DEPRECATE /D_SECURE_SCL_DEPRECATE=0 /D_SECURE_SCL=0 /DSTRSAFE_NO_DEPRECATE'
    -DCMAKE_C_FLAGS_RELEASE='/MD /clang:-march=native /clang:-mtune=native /clang:-O3 /clang:-g0 /DNDEBUG'
    ..\llvm-project\llvm

但是,有一个问题。 Windows 中的 Clang 驱动仍然不支持libc++,所以你必须手动添加头文件目录和c++.lib,如果你想使用libc++。如果你看一下 Clang 的驱动源代码,9 年前还剩下一行:

void MSVCToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
                                                 ArgStringList &CC1Args) const 
  // FIXME: There should probably be logic here to find libc++ on Windows.

添加支持不是火箭科学,只是表明作者对支持 Windows 的兴趣程度。

一个使用libc++的例子(用上面的cmake例子编译安装clang之后):

clang++ -isystem 'c:\clang\include' -isystem 'c:\clang\include\c++\v1' -c .\test.cpp -o test.o
clang++ -fuse-ld=lld test.o -o test.exe -L'c:\clang\lib' -lc++

【讨论】:

以上是关于在 Windows 上使用 libc++?的主要内容,如果未能解决你的问题,请参考以下文章

wind10优化

尝试在 libc 上使用 ctypes 调用 environ 时,为啥 Python 会出现段错误?

使用 C# 在 Windows 上检测防病毒软件 [关闭]

如何在Linux上使用Windows标头构建Visual C ++应用程序?

弄清楚一个程序如何在 Windows 上启动另一个程序

如何使用 WiX Burn 在 Windows 8 和 Windows Server 2012 上安装 .NET Framework 3.5?