2011-10-30 43 views
2

我試圖找出如何使用靜態庫,但最簡單的例子將失敗:AR介紹未定義參考

//foo.c 
int func(int i) { 
    return i+1; 
} 
//main.c 
int func(int i); 
int main() { 
    return func(41); 
} 

編譯foo.cmain.c作品:

gcc -Wall -o foo.o -c foo.c 
gcc -Wall -o main.o -c main.c 

存檔foo.o做不要抱怨:

ar rcs libfoo.a foo.o 

但是鏈接失敗,一個未定義的參考func

ld libfoo.a main.o 
ld -L. -lfoo main.o 

兩個給我:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000b0 
main.o: In function `main': 
main.c:(.text+0xa): undefined reference to `func' 

,我收到了類似的錯誤,如果我通過gcc走的彎路鏈接:

gcc libfoo.a main.o 
gcc -L. -lfoo main.o 

給我:

main.o: In function `main': 
main.c:(.text+0xa): undefined reference to `func' 
collect2: ld returned 1 exit status 

我在這裏做錯了什麼?根據我閱讀/使用的所有手冊和搜索引擎,這是使用靜態庫的方式。


編輯:請注意,gcc foo.o main.o工作得很好。

回答

1

經過大量的嘗試愚蠢的東西,最愚蠢的想法是解決方案:ld想要的對象文件首先,然後的檔案。好極了!如果你把-L無所謂很明顯,但如果你把-lfoo事項相同的程度,如果你直接指定.a文件:如果你-L.-lfoo指定庫

gcc libfoo.a main.o // fails 
gcc main.o libfoo.a // works 

也是一樣。