c++ - Windows10 上的 LLD 链接错误 : no input files when trying to link with libcmt. lib

标签 c++ c clang lld

我正在编译一个非常简单的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/

相关文章:

c# - 在 C# 中为 C++ 函数指针生成 SWIG 包装器

c++ - union 内的未知成员函数

c++ - 调用专门的 std::move()

c++ - 字符串的 std::end 是否应该指向空终止符?

c - 如何在 Windows 上通过 clang 使用 C99 复数?

c - linux C从子级向父级发送数据没问题,但无法从子级向父级发送数据

c - OpenGL/GLUT GL_LINES 的照明不正确

c - 最好将指向结构的指针传递给 C 中的函数

c++11 - boost、clang 或 gcc 谁失败了?与 boost::asio 一起使用的 std::chrono 的问题

macos - 如何在 OSX 上安装特定的 clang 版本?