1

我正在编译一个非常简单的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函数的符号。

4

1 回答 1

2

这似乎是由您的 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 为我编译,但这可能只是示例中的一个错字。)

于 2019-11-26T10:38:59.827 回答