如何使用llvm lld链接libstdc ++

时间:2017-06-14 12:26:34

标签: c++ llvm lld

我想在窗口操作系统中链接test.lllibstdc++.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.objllc

现在我要将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?请帮帮我。谢谢。

2 个答案:

答案 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 crtclang-cl -fuse-ld=lld-link test.ll libcmt.lib

当前没有使用带有clang-cl的lld(LLVM 4.0)似乎不起作用。

答案 1 :(得分:-1)

使用gcc会有效,但是lld有一个选项-lc,它告诉它链接到c ++标准库。您可能需要删除-flavour link选项并使用unixy样式界面。