首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Windows上与CMake一起使用lld?

如何在Windows上与CMake一起使用lld?
EN

Stack Overflow用户
提问于 2019-10-05 23:29:03
回答 1查看 2.8K关注 0票数 10

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

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

代码语言:javascript
复制
@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

  • setting LDFLAGS=lld.exe

  • setting -DCMAKE_LINKER=lld.exe

  • the设置
  • 解决方案

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2021-06-21 10:05:23

为了复制您的环境,我遵循了以下步骤:

https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/LLVM-12.0.0-win64.exe

我已经安装了CMake 3.20和Ninja1.10.2系统,并且安装在PATH中。

然后,我创建了具有以下内容的D:\clang-mingw.cmake

代码语言:javascript
复制
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。

设置CMAKE_<LANG>_COMPILER_TARGET将Clang配置为在编译时使用x86_64-windows-gnu目标。这对于CMake的编译器检测和正确性检查步骤非常重要。

设置CMAKE_SYSROOT可以通知Clang在哪里可以找到所有标准库和标头(即。来自明华-W64)。

最后,我们通过将-fuse-ld=lld添加到链接可执行文件、可加载模块和共享库时使用的链接器标志(但不需要静态库,因为不需要链接器,只需要归档程序)来确保LLD的使用。CMAKE_{EXE,MODULE,SHARED}_LINKER_FLAGS_INIT变量是为了这个目的从工具链中设置的。

然后,从普通命令提示符(即不是Visual命令提示符或MSYS2 bash)中运行:

代码语言:javascript
复制
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作为构建系统生成器(当然,如果您愿意,可以用不同的生成器替换它),并将工具链文件设置为上面的文件。

然后,它在没有错误的情况下构建。

代码语言:javascript
复制
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 ."
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58253100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档