我想在窗口操作系统中链接test.ll
和libstdc++.a
。
我有像这样的简单测试IR代码。
@.str = internal constant [14 x i8] c"hello, world\0A\00"
declare i32 @printf(i8*, ...)
define i32 @main(i32 %argc, i8** %argv) nounwind {
entry:
%tmp1 = getelementptr [14 x i8], [14 x i8]* @.str, i32 0, i32 0
%tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind
ret i32 0
}
我使用test.ll
成功汇编test.obj
到llc
。
现在我要将test.exe
文件设为lld
而不是gcc,cl
我尝试了这个命令但是没有工作......
lld -flavor link /entry:main /implib:libstdc++.a test.obj
它归还。
test.obj: undefined symbol: printf
error: link failed
我的LLVM版本是4.0.0,lld版本是4.0.0
我是否使用GCC?请帮帮我。谢谢。
答案 0 :(得分:1)
printf
未提供 libstdc++
,您需要链接到msvcrt等C标准库。
/entry:main
不是必需的,因为crt会调用main
/implib
不是您正在寻找的选项。它指定生成的导入库的名称。
使用g++ test.obj
成功将您的test.obj
(使用clang-cl -c test.ll
创建)与mingw-w64-crt相关联,并创建一个可运行的程序。
clang++ test.ll
(这是msys2中的mingw-w64 clang)实际上是一样的
您可以使用-v
检查调用,以找出链接的对象和库。
您还可以使用以下链接链接到static microsoft crt:
clang-cl -fuse-ld=lld-link test.ll libcmt.lib
当前没有使用带有clang-cl的lld(LLVM 4.0)似乎不起作用。
答案 1 :(得分:-1)
使用gcc会有效,但是lld有一个选项-lc
,它告诉它链接到c ++标准库。您可能需要删除-flavour link
选项并使用unixy样式界面。