在 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++?的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 libc 上使用 ctypes 调用 environ 时,为啥 Python 会出现段错误?
如何在Linux上使用Windows标头构建Visual C ++应用程序?
如何使用 WiX Burn 在 Windows 8 和 Windows Server 2012 上安装 .NET Framework 3.5?