编译问题汇总

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关键字再次声明这三个变量,
于是编译链接顺利通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值