2010-07-29 97 views
1

下面是一個例子來說明我的問題:LD找不到LIB鏈接

ld -Lpath1 -Lpath2 -lA -lB -Xlinker -T -Xlinker \ 
    -W1,-rpath,/usr/local/lib -l-o target 
ld: cannot find -lA 
collect2: ld returned 2 exit status 

兩個路徑1和路徑2是相對路徑,我可以找到庫,根據勞工處的PWD,所以爲什麼ld輸出這個錯誤消息?

任何人都可以給我一些建議來調試這個問題嗎?

我想念一些,在一個名爲rt的庫之前有一個「-static」。

根據你的建議,我嘗試讓gcc驅動ld做鏈接過程。 gcc A.o B.o -mabi = 64 -static -lrt -Xlinker -T -Xlinker ld.script -W1,-rpath,/ usr/local/lib -lmemdbg -o目標 它不起作用。

,然後我刪除「-static」選項,-lpthread後的另一個動態LIB(因爲室溫取決於並行線程被發現當我刪除「-static」)

GCC敖柏-mabi = 64 -lrt -lpthread -Xlinker -T -Xlinker ld.script -W1,-rpath,/ usr/local/lib -lmemdbg -o目標 這次,對象成功鏈接在一起。

然後我試着弄清楚爲什麼「靜態」命令不能通過向gcc 傳遞「-v」來工作。出現了一些「-L」選項,並在搜索列表中找到名爲librt.a的lib。

我真的很困惑。 GCC的版本是4.3

回答

1

有可能是因素的各種問題:

  • 你在找什麼名字? path1/libA.apath1/libA.so
  • -W1選項可能應該是-Wl,但這不會解釋鏈接錯誤。
  • -l-o選項應該可能是兩個選項,-l選項的參數(除非您確實有一個庫lib-o.alib-o.so)。
  • 您通常至少指定一個您自己設計的目標文件;只有Lex/Yacc庫(我知道)爲你提供了一個main() - 只有在經典的Unix系統上,而不是在Linux系統上。
  • 如果庫文件存在於你認爲他們在做的地方,它們是否是正確的類型?也就是說,如果你正在構建一個32位程序,他們可能是64位庫 - 反之亦然?它們是否適合您的硬件? (通常情況下,我希望鏈接說些什麼比「找不到」更貼切,但是這可能是一個問題。)
  • 你檢查的庫文件和目錄的權限?
  • 你是否有過不直接調用加載器,但使用的編譯器調用你裝載機更好?我的經驗是,編譯器知道更多關於調用裝載機正確比我 - 我已經看到越來越多的人飲恨,當他們使用ld直接使用,而不是編譯器時,比建共享對象。
+0

對不起,我不小心,有 「-l-O」 應爲 「-lC -o」,C是一個共享的庫名。爲什麼我沒有貼實編譯輸出的原因是工作環境是從網上絕緣。 這個問題是由交叉編譯上下文引起的,當我嘗試從CPU提供者升級sdk時,包括工具鏈和其他一些需要重新編譯的東西。 – Wangrui 2010-07-29 03:40:26

+0

@joeys:你是否包含正確的標誌來告訴加載器這是一個交叉編譯(交叉鏈接)?坦率地說,這是爲什麼我會推薦使用編譯器而不是原始鏈接程序的另一個例子 - 讓所有正確的標記都很難。編譯器GCC?如果是這樣,你有沒有嘗試用''-v''選項進行簡單的交叉編譯(包括鏈接階段),以查看傳遞給鏈接器的選項? – 2010-07-29 16:49:02