2017-06-14 94 views
0

我想在窗口操作系统中链接test.lllibstdc++.a如何链接libstdC++使用llvm lld

我有这样简单的测试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 
} 

我successed编译test.lltest.objllc

现在我要让test.exe文件,lld没有GCC,CL

I`ve试试这个命令,但这么想的工作......

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

我768,16使用GCC?请帮帮我。谢谢。

回答

0

printf不是由libstdc++提供的,您需要链接到C标准库,如msvcrt。
/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检查调用以找出链接的对象和库。

您也可以链接到static microsoft crt有: clang-cl -fuse-ld=lld-link test.ll libcmt.lib

不使用LLD与目前铛-CL(LLVM 4.0)似乎并没有工作。

+0

非常感谢你!我去做。 – SilverJun

-1

使用gcc可以工作,但lld有一个选项-lc,它告诉它链接到C++标准库。您可能需要删除-flavour link选项,然后使用unixy样式界面。

+0

难道你不是指C标准库吗?另外,你确定'-lc'工作窗口,没有我知道的libc,只有msvcrt。 – Darklighter