2011-12-03 57 views
1

我很新的Linux編程。你可以說我是一個Windows的傢伙。所以,我將我的項目移植到了Linux上,它幾乎讓我瘋了:我確定我已經用-l標誌指定了所有的依賴項,但是我得到了「未解決的符號」錯誤。 然後我找到了這個話題,它解決了我的問題:Boost linking on Linux with GCC爲什麼指定輸入庫的順序很重要?

有人請解釋我爲什麼順序很重要,它到底有多重要?我敢肯定它是不是MSVC連接的情況下...

回答

5

一個簡單的例子可以讓你明白爲什麼一個通過Unix連接器關心順序。

假設你有main.o(由main.cpp生成)和庫libx.a(無依賴關係)和liby.a(取決於名爲newRefX的libx)

如果鏈接進去的順序,你是作爲連接變爲細從1到3:

  1. main.o REFX =民主基金,REFY =民主基金
  2. liby.a REFX =是undef,REFY = DEF,newRefX =是undef
  3. libx.a REFX = DEF,REFY = DEF,newRefX = DEF

但如果鏈接進去的順序,你遇到的問題與newRefX:

  1. main.o REFX =民主基金,REFY =民主基金
  2. libx.a REFX =閃避,REFY =民主基金,
  3. liby.a REFX =閃避,REFY =閃避,newRefX =民主基金

所以,你可以看到你想要的最低水平庫(依賴於任何其他的)最後一次。

+0

感謝您的解釋! –

+1

擴展解釋:http://webpages.charter.net/ppluzhnikov/linker.html –

5

從「An Introduction to GCC - for the GNU compilers gcc and g++

接頭的傳統行爲是尋找外部函數從左至右在指定的庫命令行。這意味着包含函數定義的庫應該出現在任何使用它的源文件或目標文件之後。

我認爲MSVC的接頭做2個越過代碼,以便當處於不同的順序指定的圖書館,他們也許能解決,甚至符號(參考失蹤...)

+0

+1對於報價 –

2

事情是這樣的Unix連接器的工作,因爲很久以前...看到Levine's book

相關問題