2017-03-07 85 views
3

功能是啊,我知道很多人問過這個問題,但我仍然無法理解我的情況未定義參考的另一個LIB

我有2個庫的問題,比方說,力霸& libb。 libb使用liba但在.a中編譯,所以它應該在編譯時鏈接。 我有以下GCC命令:

gcc -o my_program obj/mymain.o obj/myutils.o liba/liba.a libb/libb.a -Iinclude -Iliba -Ilibb 

但GCC將返回我很多的「未定義的參考......」從libb功能力霸功能。

發生了什麼事?我該怎麼辦?

謝謝

+0

您可以顯示代碼中包含一個庫的代碼嗎?整個錯誤信息? – Marievi

+4

訂單事宜。如果庫B依賴於庫A,那麼B需要在命令行的* A之前*。 –

+0

關於'-I',使用的目的是因爲我在這些目錄中有標題,所以我想這是好的。 事實上,這是一個ordre問題,因爲@Someprogrammerdude指出....感謝您的幫助 –

回答

3

命令在link編譯命令的評價是非常重要的。

當編譯器看到.o文件時,它們會自動添加到目標二進制文件,因此所有的.o文件都存在。這留下了需要找到的未定義實體的列表。

下一個階段是通過圖書館。每個庫都被搜索,並且每個庫的滿足未定義參考的.o元素被添加到目標二進制文件中。這總能解決一些問題。但是,它也可能有更多的要求。因此添加庫的一部分可能會添加到需要滿足的元素。

當一個庫需要另一個庫時,需要在需要的庫之後以及滿足其需求的庫之前指定它。

如果.o文件也需要庫的相同部分,那麼當從.o中刪除代碼(刪除引入庫部分的機制)時會出現此問題。