很容易犯的錯誤,轉載以備注!
轉載請注明文章位址,尊重作者賴半仙的勞動成果,謝謝支援:
<a href="http://hi.baidu.com/mgqw/blog/item/0969c4230a2508559922edc3.html" target="_blank">http://hi.baidu.com/mgqw/blog/item/0969c4230a2508559922edc3.html</a>
這幾天在弄一個東西,相同的檔案編譯的動态庫和靜态庫,調用動态庫沒有問題,調用靜态庫确報錯:函數沒有定義就引用(undefined reference to ***)。讓我無比的郁悶,兩個庫檔案一模一樣都是相同的.o檔案編譯出來的,就是靜态庫調用的時候報錯,而動态庫完全正常,無比讓人抓狂。
埋頭試了n久結果在一個不經意間發現了問題的所在,無比讓人抓狂!!!!!
下面是一個簡單的例子,有幾個簡單的程式檔案:bill.c fred.c lib.h program.c(這個是主檔案)
<code>//bill.c</code>
<code>#include <stdio.h> void bill(char *arg) { printf("bill: you passed %s\n", arg); }</code>
<code>//fred.c</code>
<code>#include <stdio.h> void fred(int arg) { printf("fred: you passed %d\n", arg); }</code>
//lib.h
void bill(char *);
void fred(int);
<code>//program.c</code>
<code>#include "lib.h" int main() { bill("Hello Wold!\n"); exit(0); }</code>
總共四個檔案,用gcc指令編譯bill.c fred.c兩個檔案成動态庫
$ gcc -c bill.c fred.c
$ ar -crv libfoo. bill.o fred.o
然後編譯program.c調用libfoo.a進行連結,看看倆個效果吧,先來正确的,注意program.c libfoo.a的位置:
$ gcc -o test
program.c libfoo.a
program.c: 在函數‘main’中:
program.c:6: 警告:隐式聲明與内建函數‘exit’不相容
下面是連結報錯的,其他都一樣,隻是mian函數檔案和靜态庫檔案位置調換了一下,立馬報錯:
]$ gcc -o test
libfoo.a program.c
/tmp/cc88fWhl.o: In function `main':
program.c:(.text+0x19): undefined reference to `bill'
collect2: ld 傳回 1
這麼一個小小的問題害我迷茫了兩天,我靠,看來還是要養成好習慣:
永遠把含有mian函數的主檔案放在編譯指令的第二位(第一是定義輸入檔案名)那就不會出錯了。
或者是永遠把庫檔案放在編譯連結指令的最後。
<b></b>
<b>本文轉自 xkdcc 51CTO部落格,原文連結:http://blog.51cto.com/brantc/441293,如需轉載請自行聯系原作者</b>