lib1.c
#include <stdio.h>
int fun()
{
printf("lib1\n");
return 0;
}
lib2.c
#include <stdio.h>
int fun1()
{
return 0;
}
int fun()
{
printf("lib2\n");
return 0;
}
test.c
#include <stdio.h>
int fun();
int fun1();
int main()
{
fun1();
fun();
}
生成庫liblib1.a和liblib2.a
當這樣編譯test時,gcc test.c -L. -llib2 -llib1 不會發生編譯出錯
而gcc test.c -L. -llib1 -llib2時
會出現以下編譯錯誤:
./liblib2.a(lib2.o): In function `fun':
lib2.c:(.text+0xa): multiple definition of `fun'
./liblib1.a(lib1.o):lib1.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
因為對ld的實現不是很清楚,猜測如下,先將符號表寫好,然後按照各個庫的順序查找符號,直到滿足所有的符號,後面的庫忽略,這就使得第一種情況不會出錯,但在定位符號時,應該是將符號表中的所有符號和庫中的符號對比,這就導致了第二種情況,而不是已找到符號的不再後面的庫中繼續查找。
當在兩個實現文件中再添加一個同名函數fun2時,但是test.c並未調用fun2 也會出現重定義的錯誤,所以這個比較順序還是拿庫和符號表對比,而不是拿符號表和庫對比。