2015-07-20 95 views
1

我有兩個靜態庫文件(.a)和一個使用opt pass創建的bitecode文件(.bc)。在這個咬文件中我添加了我的自己的代碼,並在此代碼中,我需要調用靜態庫中聲明的函數。我已經注意到,LLVM-LD工具不再存在鐺新的版本,所以我嘗試了兩種不同的方法這三個文件鏈接(兩個圖書館和一個bitecode文件):當在llvm中鏈接* .a和* .o文件時出現錯誤

嘗試用gcc鏈接:

與LLC創建file.bc的目標文件

$llc -filetype=obj file.bc -o file.o 

鏈接對象和庫與海灣合作委員會

$gcc -I lib1.a lib2.a -O3 file.o -o file 

個這些命令給我這個錯誤:

file.o: In function `main': 
file.bc:(.text+0xc0): undefined reference to `function_in_lib' 
collect2: error: ld returned 1 exit status 

(function_in_lib是,我需要從lib和編譯器調用無法找到此功能的函數)

2.的第二種方法是使用ld命令

與LLC創建file.bc

的對象文件
$llc -filetype=obj file.bc -o file.o 

鏈接對象和庫用LD

$ld -o linked lib1.a lib2.a file.o -lc

這些命令給我這個錯誤:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004002b0 
new.o: In function `main': 
new.bc:(.text+0xc0): undefined reference to `function_in_lib' 

我試圖改變參數的順序,但我有更多的錯誤,當我做它。我認爲,從故障的連接成爲,任何想法?

+0

'$ gcc的-I了lib1.a lib2.a -O3 file.o -o文件'應該改爲'$ gcc -llib1.a -llib2.a -O3 file.o -o file'。 gcc的'-I'參數是指定額外的包含路徑。 –

+0

當我嘗試你的圖書館的建議格式時,這給我: '/ usr/bin/ld:找不到-llibtpc.a /usr/bin/ld:找不到-llibregions。一個 collect2:錯誤:LD返回1退出status' – adespotos

+0

哎呀,我沒有在第一評論:)刪除庫的前綴和後綴('.a','.so'末和'lib'各圖書館的開始)。確保它們可用並放置在正確的目錄(通常爲'/ usr/lib /') –

回答

1

你得到未定義引用的原因是因爲你以錯誤的方式鏈接你的庫。鏈接器按增量順序工作 - 查看您提供的第一個文件,並收集文件引用但找不到的文件列表。然後鏈接器移動到下一個庫並執行相同的操作,但也尋找機會修復以前庫中未定義的引用。

ld找不到function_in_lib是因爲它連接file.o庫後,因此不會有機會填補引用file.o要求的原因。如果你正在尋找關於鏈接的更多細節以及爲什麼你遇到這個問題,this是一個相當不錯的介紹。

如果你只是想解決您的問題,庫文件移動到您的命令file.o後,即

ld -o linked file.o lib1.a lib2.a -lc 
+0

正如我寫在我的問題,我試圖改變參數的格式,這給我更多錯誤的未定義的參考是關於來自圖書館的電話。 (這些庫不是我的,我只能用它來進行我的項目) – adespotos

+0

UPDATE:你是對的@Matt,我的失敗是參數的順序,當我編譯庫時缺少標誌(關於numa和線程,但是這個對於這種特殊情況是我的錯)你的回答對於這個問題絕對有用。感謝您的回答.. – adespotos