为了复制您的环境,我按照以下步骤操作:
我在系统范围内安装了 CMake 3.20 和 Ninja 1.10.2,并且在PATH
.
然后,我创建D:\clang-mingw.cmake
了以下内容:
set(CMAKE_C_COMPILER "C:/Program Files/LLVM/bin/clang.exe")
set(CMAKE_CXX_COMPILER "C:/Program Files/LLVM/bin/clang++.exe")
set(CMAKE_C_COMPILER_TARGET x86_64-windows-gnu)
set(CMAKE_CXX_COMPILER_TARGET x86_64-windows-gnu)
set(CMAKE_SYSROOT "C:/msys64/mingw64")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
这称为工具链文件。这些用于通知 CMake 有关非标准编译器和库设置的信息,例如这个。
设置CMAKE_<LANG>_COMPILER
变量(自然)将 CMake 指向您要使用的编译器。在这种情况下,那就是 Clang。
SettingCMAKE_<LANG>_COMPILER_TARGET
将 Clang 配置为x86_64-windows-gnu
在编译时使用目标。这对于 CMake 的编译器检测和完整性检查步骤很重要。
设置CMAKE_SYSROOT
通知 Clang 在哪里可以找到所有标准库和头文件(即来自 mingw-w64 的那些)。
-fuse-ld=lld
最后,我们通过添加链接可执行文件、可加载模块和共享库(但不是静态库,因为不需要链接器,只需要存档器)时使用的链接器标志来确保使用 LLD 。CMAKE_{EXE,MODULE,SHARED}_LINKER_FLAGS_INIT
为此,应从工具链中设置变量。
然后从普通命令提示符(即不是 Visual Studio 命令提示符或 MSYS2 bash),我运行:
D:\SDL2-2.0.14>cmake -G Ninja -S . -B build -DCMAKE_TOOLCHAIN_FILE=D:/clang-mingw.cmake -DCMAKE_BUILD_TYPE=Debug -DDIRECTX=OFF -DSDL_TEST=OFF -DSDL_SHARED=OFF -DSDL_STATIC=ON
-- The C compiler identification is Clang 12.0.0
-- The CXX compiler identification is Clang 12.0.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/LLVM/bin/clang++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
-- Performing Test HAVE_GCC_WALL
-- Performing Test HAVE_GCC_WALL - Success
[... output clipped ...]
我使用的配置命令只是复制您在问题中使用的特定于 SDL 的设置。它只是选择 Ninja 作为构建系统生成器(如果您愿意,当然可以将其替换为不同的生成器)并将工具链文件设置为上述文件。
然后它构建没有错误。
D:\SDL2-2.0.14>cmake --build build
[... output clipped ...]
[163/164] C:\PROGRA~1\LLVM\bin\clang.exe --target=x86_64-windows-gnu --sysroot=C:/msys64/mingw64 -DUSING_GENERATED_CONFIG_H -Iinclude -I../include -idirafter "D:/SDL2-2.0.14/src/video/khronos" "-ID:/SDL2-2.0.14/src/hidapi/hidapi" -msse3 -msse2 -msse -m3dnow -mmmx -Wshadow -fvisibility=hidden -Wdeclaration-after-statement -Werror=declaration-after-statement -fno-strict-aliasing -Wall -g -MD -MT CMakeFiles/SDL2-static.dir/src/video/yuv2rgb/yuv_rgb.c.obj -MF CMakeFiles\SDL2-static.dir\src\video\yuv2rgb\yuv_rgb.c.obj.d -o CMakeFiles/SDL2-static.dir/src/video/yuv2rgb/yuv_rgb.c.obj -c ../src/video/yuv2rgb/yuv_rgb.c
[164/164] cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E rm -f libSDL2d.a && C:\PROGRA~1\LLVM\bin\llvm-ar.exe qc libSDL2d.a @CMakeFiles\SDL2-static.rsp && cd ."