由于新添加了日志动态链接库
先前的项目中,用到了一个数据库的database.so
图1
添加日志后:
图2
在使用log.so的过程中,Main.cpp和databas.so分别使用log.so是没有问题的
图3
但是:当全部整合到一起后,如图2
报错:database.so中:undefined reference to log.so中的函数。
解决的方法是:
因为log.so是用c语言,而我的c++程序使用g++编译,所以,在log.so中的log.h头文件里,要加入
#ifdef __cplusplus extern "C"{ #endif
#ifdef __cplusplus } #endif
extern "C",见http://blog.csdn.net/zx824/article/details/6774817
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
其他解决该问题的方法:http://blog.csdn.net/cserchen/article/details/5503556
Linux下编译程序时,经常会遇到“undefined reference to XXX” 报错,
这里总结一些可能的原因和解决方案,给需要的朋友:
说道undefined reference error,先提一下Linux gcc链接规则:
链接的时候查找顺序是:
动态库调用的查找顺序:
一般情况链接的时候我们采用-L的方式指定查找路径, 调用动态链接库的时候采用LD_LIBRARY_PATH的方式指定链接路径.
另外注意一个问题,就是只要查找到第一个就会返回,后面的不会再查找. 比如-L./A -L./B -lx 在A中有libx.a B中有libx.a和libx.so, 这个时候会使用在./A的libx.a 而不会遵循动态库优先的原则,因为./A是先找到的,并且没有同名动态库存在
对于动态链接库,实际的符号定位是在运行期进行的.在编译.so的时候,如果没有把它需要的库和他一起进行联编,比如libx.so 需要使用uldict, 但是忘记在编译libx.so的时候加上-luldict的话,在编译libx.so的时候不会报错,因为这个时候libx.so被认为是一个库,它里面存在一些不知道具体实现的符号是合法的,是可以在运行期指定或者编译另外的二进制程序的时候指定.
如果是采用 g++ -Lpath -lx 的方式进行编译,链接器会发现所需要的uldict的符号表找不到从而报错,但是如果是程序采用dlopen的方式载入,由于是运行期,这个程序在这个地方就直接运行报错了.另外还有一种情况就是一个对外的接口在动态库中已经声明定义了,但是忘记实现了,这个时候也会产生类似的错误.
如果在运行期报出这样的错误,就要注意是否是由于某些库没有链接进来或者某些接口没有实现的原因产生
有了上述基础,不难看出,undefined reference error错误的原因是:
这个问题,在我这里很搞笑。。
同样的so。重新编译一下。就可以了。
其他的,若有问题,看大家的人品吧。
查看了很多网页,对该问题从不懂到懂,但也确实没用得上那些。。。