链接标准库 MSVC 失败,MinGW 工作正常

Linking standard library MSVC fails, MinGW works

提问人:Kay Verbruggen 提问时间:12/29/2018 更新时间:12/30/2018 访问量:134

问:

所以我有以下 LLVM IR 文件:

@msg = global [24 x i8] c"Hello LLVM!"

declare i32 @puts(i8* %string)

define void @main() {
"entry block":
    %0 = getelementptr [24 x i8], [24 x i8]* @msg, i32 0, i32 0
    %1 = call i32 @puts(i8* %0)
    ret void
}

然后,我使用 llc 将其转换为 .obj 文件。如果我尝试链接标准库(用于 put 函数),它可以正常工作,请使用 MinGW 库:

link /ENTRY:main /DEFAULTLIB:libmsvcrt.a /LIBPATH:"C:\Program Files\mingw-w64\mingw64\x86_64-w64-mingw32\lib" /SUBSYSTEM:CONSOLE /OUT:bin/program.exe bin/program.obj 

但是使用 MSVC 库会失败:

link /ENTRY:main /DEFAULTLIB:msvcrt.lib /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64" /SUBSYSTEM:CONSOLE /OUT:bin/program.exe bin/program.obj 

program.obj : error LNK2019: unresolved external symbol puts referenced in function main
bin/program.exe : fatal error LNK1120: 1 unresolved externals

我无法弄清楚我在这里错过了什么,希望这里有人可以提供帮助。

链接器 llvm-ir unresolved-external

评论

0赞 Frank C. 12/29/2018
找出 put 函数在哪个 MS 库中,它位于何处,并将其添加到您的 libpath 中
0赞 Frank C. 12/29/2018
另外,你确定它不是vs吗?_putsputs
0赞 Kay Verbruggen 12/29/2018
根据 MSDN 和其他一些 LLVM Hello world 示例,Put 应该是正确的。根据 MSDN,Put 位于 C 运行时库的每个版本中,msvcrt.lib 位于该文件路径中。它也是x64,所以这也不应该是问题。

答:

2赞 Kay Verbruggen 12/30/2018 #1

所以我终于设法找到了问题,尽管我仍然不确定为什么它不起作用。对我来说,解决方案是链接 ucrt.lib,它是 C 运行时库的不同版本。但是在MSDN上,他们表示任何版本都可以与puts一起使用。我通过在 Visual Studio 中用 C 语言制作一个小的“hello world”并打开 /VERBOSE:lib 来查看它们链接的内容来解决这个问题。

评论

0赞 Frank C. 12/31/2018
这就是为什么我说要找出位置,我知道它确实移动到了某个地方,但不记得是哪个库。很高兴你找到了它。