c++ - 如何在 Windows 上将 lld 与 CMake 一起使用?

标签 c++ windows cmake llvm lld

我正在尝试在 Windows 10 上使用带有 clang + lld ( https://www.libsdl.org/download-2.0.php ) + mingw ( http://releases.llvm.org/ ) header 的 CMake 编译 SDL2 ( https://sourceforge.net/projects/mingw-w64/ )。尽管我付出了很多努力,但我似乎无法让 CMake 使用 lld mingw ld 链接器上的链接器。

我目前使用批处理文件构建 sdl2:

@ECHO OFF

IF NOT EXIST build MKDIR build
PUSHD build

cmake.exe -DCMAKE_BUILD_TYPE=Debug -G "MinGW Makefiles"^
  -DCMAKE_C_FLAGS="-target x86_64-windows-gnu"^
  -DCMAKE_C_COMPILER_ID="Clang" -DCMAKE_C_COMPILER="clang.exe"^
  -DCMAKE_CXX_FLAGS="-target x86_64-windows-gnu"^
  -DCMAKE_CXX_COMPILER_ID="Clang++" -DCMAKE_CXX_COMPILER="clang++.exe"^
  -DDIRECTX=OFF -DSDL_TEST=OFF -DSDL_SHARED=OFF -DSDL_STATIC=ON ..

cmake.exe --build . -- -j %NUMBER_OF_PROCESSORS%

POPD


我试过无济于事:
  • 设置 -fuse-ld=lld.exe
  • 设置 LDFLAGS=lld.exe
  • 设置 -DCMAKE_LINKER=lld.exe
  • 解决方案来自:CMake: use a custom linker

  • 任何帮助将不胜感激。

    最佳答案

    为了复制您的环境,我按照以下步骤操作:

  • 我将 LLVM+Clang 12 安装到 C:\Program Files\LLVM来自 GitHub 发布页面:https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/LLVM-12.0.0-win64.exe
  • 我下载了mingw-w64通过 MSYS2。我已经安装到 C:\msys64 .见:https://www.msys2.org/
  • 然后我从 https://www.libsdl.org/release/SDL2-2.0.14.zip 下载了 SDL2 2.0.14并解压到D:\SDL2-2.0.14

  • 我在系统范围和 PATH 中安装了 CMake 3.20 和 Ninja 1.10.2 .

    然后,我创建了 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")
    
    这称为 toolchain file .这些用于通知 CMake 有关非标准编译器和库设置的信息,例如这个。
    设置CMAKE_<LANG>_COMPILER变量(自然)将 CMake 指向您要使用的编译器。在这种情况下,那就是 Clang。
    设置CMAKE_<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 ."
    

    关于c++ - 如何在 Windows 上将 lld 与 CMake 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58253100/

    相关文章:

    c++ - 为矩阵 C++ 重载 "+"运算符

    c - 在winapi中拖放

    c++ - 使用多个库时,在 CMakeList 中配置 target_link_libraries 的正确方法是什么?获取无法指定链接库错误

    node.js - 如何在放大镜滴管下获取像素颜色?

    cmake - 如何在可执行文件名称中获取调试后缀

    c - 如何将编译选项从目标传播到 Cmake 上的所有其他目标

    C++ - 值意外更改

    c++ - 类型名、类型成员和非类型成员 : is it valid code?

    c++ - 使用系统时间的随机数都一样

    windows - Windows 不再有 SVN 控制台客户端?