程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> linux下的庫沖突問題,linux庫沖突問題

linux下的庫沖突問題,linux庫沖突問題

編輯:關於C語言

linux下的庫沖突問題,linux庫沖突問題


  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  也會出現重定義的錯誤,所以這個比較順序還是拿庫和符號表對比,而不是拿符號表和庫對比。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved