链接标准库MSVC失败,MinGW可用

时间:2018-12-28 20:14:52

标签: linker llvm llvm-ir unresolved-external

所以我有以下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文件。如果我尝试链接标准库(用于puts函数),则可以使用MinGW lib很好地工作:

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

我不知道我在这里想念的是什么,希望这里有人可以提供帮助。

1 个答案:

答案 0 :(得分:0)

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