linux鏈接動態庫提示某個函數找不到 undefined xxx

聲明:本人是菜鳥,學習階段,不對之處請不吝賜教

在學習tinyxml庫時,寫了個小程序,提示start.S:109: undefined reference to `main',網上各種答案,基本如下幾種情況

1、確實缺少main

2、編譯選項不對

3、其他問題導致

我的是編譯選項不對,修改後編譯通過;抱歉,怎麼解決的沒記住。


我是用c來調用tinyxml庫,tinyxml的庫是c++實現的,所以用了一箇中間層的parsexml.cpp來轉接,實現兩個函數GetAllNodePara是調用tinyxml編譯生成的庫函數實現xml文檔獲取

GetAllNodeParaInterface封裝一下提供給c語言用

int GetAllNodePara(TiXmlNode * baseNode, tXmlNodeListDef * pNodeList, int startLevel, tXmlNodeAddrDef *pNodeAddr);

int GetAllNodeParaInterface(char * xmlfile, tXmlNodeListDef * pNodeList,  tXmlNodeAddrDef * pNodeAddr);


代碼編譯完成後,用main.c調用GetAllNodeParaInterface,編譯是總是提示該函數找不到,我覈對已經用extern "C"進行過定義,是的parsexml.cpp的接口函數用"C"的約定來編譯;(c和c++的動態庫可以互相調用,網上大能都建議不要混用,對於有些只熟悉一門語言的就比較難辦了)

編譯生成libparsexml.so過程中沒有問題,但用nm -D libparsexml.so發現沒有自己編寫的函數(也可以用readelf查看),如下圖所示,自己寫的兩個函數沒有,調用的libtinyxml.so的庫函數也沒有,那麼問題應該是出在編譯過程中。



重新覈對代碼,發現中間存在很多問題,但奇怪編譯器竟然沒有報錯,成功的編譯了libparsexml,so,後來我想肯定是我的代碼拼寫問題導致。

修改了多處低級錯誤,比如if(NULL = pName) (少了個等號)之後編譯成功,成功後的libparsexml.so再用nm -D  查看如下圖,多了很多東西


寫下這篇博客的目的是提醒自己以及在學習編程的初學者,很多時候編譯輸出的問題並不是問題點直接能看出來的,有可能是其他地方出了問題導致的,linux編譯尤其如此。

所以初學的如果用了複雜一點結構體、指針、鏈接了動態庫之類的,如果編譯出了問題,在找不到問題時,最好將自己的代碼重新過一遍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章