聲明:本人是菜鳥,學習階段,不對之處請不吝賜教
在學習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編譯尤其如此。
所以初學的如果用了複雜一點結構體、指針、鏈接了動態庫之類的,如果編譯出了問題,在找不到問題時,最好將自己的代碼重新過一遍。