1.未定义的引用
1.1 类没有实例化就使用了(没有定义就使用了变量)
今晚在做一个需求,需求是将Oracle数据库移到MySQL数据中,在驱动程序中编译的时候报错变量manger没有定义,然后就使用了(没有定义就使用了变量)
然后发现在定义manager的时候,没有写对应分支,添加上之后成功编译。
1.2 链接动态库报【**函数未定义的引用】
函数没有被编译到动态库中,用nm查看动态库的中是否将函数真正编译到动态库中,如:
nm libzcrypt.so | grep sm_encryption
1.3 20220427编译已经包含头文件也正确连接库
发现库中只有部分写了“extern "C" ”, 这个也会导致CPP找不到对应的C语言函数,啊,难受啊!!!!!那个库是C语言写的,里面的在头文件在写的时候没有用extern "C",我写的C++程序,调用不到,我特么,找了一个小时,我很生气!!
1.4 其他
检查extern "C"的写法,加上或者去掉.
将包含这个函数定义的so提前.
如果还有问题,还要注意链接时各个so的顺序,进行适当调整看看.有时调用的要在被调用的前面,有时在后面.可能跟头文件顺序有关.
2..h和.c和.cpp多文件包含时候发生的多重定义错误问题
问题描述如下:
有三个源文件,A.h、B.cpp、C.cpp。
A.h是头文件,其中声明了三个变量a1、a2、 a3。
B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件。B.cpp和C.cpp中均包含头文件A.h.
在编译时,编译能够通过,但链接时出了问题,出现"error LNK1169:找到一个或多个多重定义的
符号"的错误.经过分析,确定了这是由于两个实现文件中重复包含了头文件而造成的。可解决方法
却始终找不到.要注意的是,在这里,在头文件中加入#ifndef……#endif这样的预编译命令是没用的,
因为这是防止嵌套包含头文件的,而本例中并没有嵌套包含,是在两个文件中分别包含.因为这三个
变量在两个实现文件中都要用到,所以一定要包含在A.h中.
解决方法:
在A.h中的三个变量声明前加上extern关键字,然后在B.cpp中不加extern关键字再次声明这三个变量,
于是编译链接顺利通过。