1. 程式人生 > >linux下編譯自己的靜態庫時依賴其他的動態庫,使用時出現“undefined reference to”

linux下編譯自己的靜態庫時依賴其他的動態庫,使用時出現“undefined reference to”

        對於我這個剛入IT行業不就得新手來說,在linux下連結庫的時候總是會遇到各種各樣奇葩的問題,最多的就是“undefined reference to”和“cannot find”這兩類,層出不窮,總是在我即將完成工作的時候給我當頭一棒,讓我欲罷不能。這不,這幾天編譯linux下一個專案時又遇到難題了。

        在我編譯的專案中,其中需要編譯一個靜態庫(下面命名為libA.a),而libA.a需要依賴另外兩個動態庫(下面命名為libB.so和libC.so),剛開始在編譯libA.a時,提示找不到libB.so和libC.so裡面的函式介面。然後看了一下Makefile,便發現了原因。這個不難。原來是我只在由.o檔案連線成.a檔案時有連結了libB.so和libC.so動態庫,但是在由.c編譯成.o時並沒有連結libB.so和libC.so。所以這一步直接提示找不到動態庫裡面的函式介面。按照上面的錯誤原因修改Makefile之後,便輕易地編譯成功了。

        就在我以為一切都大功告成的時候,我才發現我又高興的太早了。當我將編譯好的libA.a以及它所依賴的libB.so和libC.so都連線在專案中時(像我一樣的新手千萬別忘了,這個依賴的是動態庫,要連同一起連線在專案中,我就吃過虧),編譯出現的錯誤,錯誤內容還是“undefined reference to”libB.so和libC.so裡面的函式介面。我當時就蒙了,這是什麼情況,我明明都連結進去了啊,為什麼還是這樣。從錯誤的提示內容可以看出libA.a裡面的函式介面都正常,唯獨libB.so和libC.so他們兩個裡面的函式介面找不到。我就懷疑是不是沒有找到這兩個動態庫或者連結出錯之類的,折騰了一會我發現我又錯了,如果沒連結成功會有類似“cannot find”之類的提示。所以說鏈是連結上了,可為什麼還是找不到呢。就在我百思不得其解時,突然一個念頭從腦海中閃過“順序”,難道問題是出在我連線庫的順序上?當前的順序是先連線的libB.so和libC.so,然後再連結libA.a。於是我抱著一絲希望將libA.a調到了libB.so和libC.so兩個前面,先連線libA.a,執行make。。。真TM編過了。哎,看來真的是年輕啊。

        至於為什麼會這樣,在這就不多廢話了,有興趣的碼友可以專門去了解一下。