如何 link libstdc++ 使用 llvm lld

how to link libstdc++ using llvm lld

我想 link test.lllibstdc++.a 在 window OS.

我有像这样的简单测试 IR 代码。

@.str = internal constant [14 x i8] c"hello, world[=11=]A[=11=]"

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
}

我用 llc 成功地将 test.ll 编译为 test.obj

现在我想制作 test.exe 文件 lld 而不是 gcc,cl

我试过这个命令,但没有用...

lld -flavor link /entry:main /implib:libstdc++.a test.obj

它return这个。

test.obj: undefined symbol: printf
error: link failed

我的LLVM版本是4.0.0,lld版本是4.0.0

我应该使用 GCC 吗?请帮帮我。谢谢。

使用 gcc 可以,但是 lld 有一个选项 -lc 告诉它 link 到 c++ 标准库。不过,您可能需要删除 -flavour link 选项并使用 unixy 风格的界面。

printf 没有被 libstdc++ 提供,你需要 link 到像 msvcrt 这样的 C 标准库。
/entry:main 不是必需的,因为 main 将被 crt 调用。
/implib 不是您要查找的选项。它指定要生成 的导入库的名称。

使用 g++ test.obj 成功 link将您的 test.obj(使用 clang-cl -c test.ll 创建)发送到 mingw-w64-crt 并创建一个可运行的程序。
clang++ test.ll(这是 msys2 中的 mingw-w64 clang)实际上是一样的。
您可以使用 -v 检查调用以找出哪些对象和库被 linked。

您还可以通过以下方式 link 到 static microsoft crtclang-cl -fuse-ld=lld-link test.ll libcmt.lib

当前不将 lld 与 clang-cl 一起使用(LLVM 4.0)似乎不起作用。