我正在编译一个非常简单的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
函数的符号。
最佳答案
这似乎是由您的 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
。
(此外,由于 return;
在返回 int 的函数中,C 代码本身无法使用带有给定参数的 clang 为我编译,但这可能只是示例中的错字.)
关于c++ - Windows10 上的 LLD 链接错误 : no input files when trying to link with libcmt. lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59043551/