2017-06-14 91 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