我正在编译一个非常简单的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
,据推测这是您放置输入文件的位置。另外请记住,我必须链接agaisnt libcmt.lib
才能获得mainCRTStartup
函数的符号。
答案 0 :(得分: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
。
(此外,由于函数中的return;
返回了int,C代码本身也无法使用带有给定参数的clang为我编译,但这在示例中可能只是一个错字。)>