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编译尤其如此。

所以初学的如果用了复杂一点结构体、指针、链接了动态库之类的,如果编译出了问题,在找不到问题时,最好将自己的代码重新过一遍。

你可能感兴趣的:(linux)