天天看點

[轉]gcc下程式調用靜态庫編譯指令:主檔案必須在靜态庫前面!

很容易犯的錯誤,轉載以備注!

轉載請注明文章位址,尊重作者賴半仙的勞動成果,謝謝支援:

<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 &lt;stdio.h&gt; void bill(char *arg) {     printf("bill: you passed %s\n", arg); }</code>

<code>//fred.c</code>

<code>#include &lt;stdio.h&gt; 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>

繼續閱讀