所以我有以下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
我不知道我在这里想念的是什么,希望这里有人可以提供帮助。
答案 0 :(得分:0)
所以我终于设法找到了问题,尽管我仍然不确定为什么它不起作用。对我来说,解决方案是链接ucrt.lib,它是C运行时库的另一个版本。但是在MSDN上,他们表示任何版本都可以使用puts。我通过在Visual Studio中用C创建一个小的“ hello world”并打开/ VERBOSE:lib来查看它们之间的链接来弄清楚。