首页 > 解决方案 > 如何在 Windows 上使用 clang 从命令行传递链接器脚本?

问题描述

我使用的是 Windows 操作系统,clang 版本是 8.0.0。我已经安装了视觉工作室社区。

我正在为我的一个程序尝试自定义内存映射的链接器脚本。

我正在从命令行编译和执行程序。这些是我在 Windows 上尝试过的选项

clang main.c -ffreestanding -nostartfiles -nodefaultlibs -Wl,-Tlinker.ld -o main

引发的错误是:

LINK : warning LNK4044: unrecognized option '/T'; ignored
linker.ld : fatal error LNK1107: invalid or corrupt file: cannot read at 0x76
clang: error: linker command failed with exit code 1107 (use -v to see invocation)

当我尝试使用时-fuse-ld=lld-link,错误有所不同

lld-link: warning: ignoring unknown argument: -Tlinker.ld
lld-link: error: <root>: undefined symbol: mainCRTStartup 
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我想知道为什么

相同的命令在 ubuntu 上有效,但在 Windows 上无效?

还请让我知道传递链接器脚本的解决方案。

windows上是否有任何clang命令应该同时使用链接器脚本和clang链接器lld-link

标签: windowsvisual-studiolinkerclanglinker-scripts

解决方案


使用 clang-cl 的 Windows Visual Studio 帮助

clang-cl   options files  -fuse-ld=lld-link -v

-v 显示命令以运行和使用详细输出

-fuse-ld=lld-link 使用 ld 链接器 lld-link for Windows

-fuse-ld=lld 使用 ld 链接器 ld.lld for Linux

cmake -E env LDFLAGS="-fuse-ld=lld-link" PATH="<path\to\ninja>" 
  cmake -H. -G Ninja -Bbuild 
     -DCMAKE_C_COMPILER:PATH="%ProgramFiles(x86)%\LLVM\bin\clang.exe" 
     -DCMAKE_CXX_COMPILER:PATH="%ProgramFiles(x86)%\LLVM\bin\clang.exe" 
     -DCMAKE_C_COMPILER_ID="Clang" 
     -DCMAKE_CXX_COMPILER_ID="Clang" 
     -DCMAKE_SYSTEM_NAME="Generic"

LLVM Windows 链接器支持

Microsoft Visual Studio 2019 链接器选项

Windows 上的 cmake、ninja、clang-cl

Windows 上的 Clang-cl 手册

LLD 和 clang-cl 的 LLVM 扩展

(已解决) ld-link 与 Windows 的研究

我通过比较 clang 的输出 LL 文件发现了这一点,并注意到开头有一条奇怪的线:

目标三元组 =“x86_64-pc-windows-msvc”添加到 .LL 文件

一旦我将它添加到我的testinput.ll文件中,一切都与lld-link. 欢呼!


推荐阅读