2

我想链接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.lltest.objllc

现在我想test.exelld用不是 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 吗?请帮帮我。谢谢你。

4

2 回答 2

1

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

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

您还可以使用以下方法链接到静态 microsoft crtclang-cl -fuse-ld=lld-link test.ll libcmt.lib

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

于 2017-06-19T04:47:32.253 回答
0

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

于 2017-06-19T01:36:47.007 回答