【问题标题】:how to link libstdc++ using llvm lld如何使用 llvm lld 链接 libstdc++
【发布时间】:2017-11-16 14:33:36
【问题描述】:

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

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

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

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 吗?请帮帮我。谢谢。

【问题讨论】:

    标签: c++ llvm lld


    【解决方案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) 似乎不起作用。

    【讨论】:

    • 非常感谢!!我会这样做的。
    【解决方案2】:

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

    【讨论】:

    • 你不是说 C 标准库吗?另外,你确定-lc 可以在windows 下工作吗,我知道没有libc,只有msvcrt。
    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多