天天看點

C/C++中多個庫互相包含時,連結器的處理規則

C/C++中多個庫互相包含時,連結器的處理規則

以下結果都是在gcc(4.8.5)下測試的,其他平台及版本不确定是否一緻。

1. 在連結的時候,如果兩個庫中直接定義了同名接口,連結兩個庫是會報重複定義錯誤的。(無論接口實作是否相同)

2. 但是,如果兩個庫中的同名接口來自另外一個庫,即,如果AB.a AC.a 都連結了A.a  那AB.a 和AC.a 還可以連結進同一個可執行檔案或者庫,這個時候

   2.1 如果兩個A.a一樣,則連結正常進行。

   2.2 如果兩個A.a不一樣但互相包含,比如AB 在AC前。

   ​    2.2.1 如果這個時候AB中的A包含AC中的A(即AC中有的AB中都有),那連結正常進行。

   ​    2.2.2 如果這個時候AC中的A包含AC中的A(即AB中有的AC中都有),那會連結失敗。(把連結順序倒一下就可以了,把AC放到AB前,即讓全的放到前面)

   2.3 如果兩個A.a不互相包含,則怎麼放都會報錯。