【问题标题】:lld-link error: no input files when trying to link with libcmt.lib on Windows10lld-link 错误:在 Windows 10 上尝试与 libcmt.lib 链接时没有输入文件
【发布时间】:2019-11-26 03:58:56
【问题描述】:

我正在编译一个非常简单的main.c:

int myfunc(int x, int y){
    return x + y;
}

int main(){
    int res = myfunc(2,2);

    return;
}

我正在使用以下选项进行编译:

clang.exe -std=c11 -g -c .\main.c

我得到我的main.o 作为输出。现在我使用lld-link.exe 使用以下选项进行链接:

lld-link.exe -defaultlib:libcmt -libpath:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\" .\main.o

我收到以下错误:lld-link: error: no input files

但显然main.o 作为最后一个参数,应该是您放置输入文件的位置。另请记住,我必须链接到 libcmt.lib 才能获得 mainCRTStartup 函数的符号。

【问题讨论】:

  • main.o 放在选项前面有帮助吗?还是有助于删除 libpath 的最后一个反斜杠?恐怕\" 不会被识别为引用参数的结尾。顺便说一句,大多数 Windows 工具确实将正斜杠理解为路径分隔符。

标签: c++ c clang lld


【解决方案1】:

这似乎是由您的 libpath 参数中的尾随反斜杠触发的。而且我认为这实际上是由于 windows cmd 引用的工作方式,而不是由于任何 lld 特定问题。

由于 libpath 参数以 x64\" 结尾,因此右引号被解释为转义的文字引号,因此 .\main.o 被解释为 libpath 参数的一部分,并尝试运行命令,即使引用的字符串没有没有匹配的结束语。 (在 stackoverflow 上,语法高亮实际上以相同的方式解释它。)

要么将反斜杠更改为结束引号之前的双反斜杠,要么从该选项中删除尾随反斜杠。

https://devblogs.microsoft.com/oldnewthing/?p=12833你可以找到更深入的windows shell引用规则的解释。

修复后,我仍然必须添加 -libpath:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\lib\x64" -libpath:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64" 才能真正找到 libcmt.lib(在 MSVC 下)和 libucrt.lib

(此外,C 代码本身无法使用给定参数的 clang 为我编译,因为 return; 在返回 int 的函数中,但这可能只是示例中的一个错字。)

【讨论】:

  • 对 stackoverflow 将 main.o 解释为字符串这一事实的精彩观察。我确实简化了我的实际程序,没有仔细检查它是否实际编译:)
猜你喜欢
  • 2019-10-03
  • 2022-01-04
  • 2012-03-10
  • 1970-01-01
  • 2018-11-08
  • 2016-08-02
  • 2020-02-16
  • 2013-12-16
相关资源
最近更新 更多