编译的时候所使用的动态库中出现错误:未定义的引用

1、使用makefile编译的时候,出现错误如下:

如上图所示,是在动态库libicdbapi.so中出现了未定义错误,既然是未定义错误,说明sqlprct、...、sqlnult这5个符号是外部符号,是在其他文件中定义的。可以使用nm命令查看libicdbapi.so动态库中的所有符号,如下:

上图并不是nm命令的所有结果,U表示该符号未定义。关于nm命令的使用方法可以参考https://blog.csdn.net/stpeace/article/details/47089585,也可以查看manpage。

从上面的结果可以看出:在动态库中有许多未定义的符号,即使用了外部符号。之前一直错误的认为动态库中应该不存在未定义符号,所有的符号应该是在动态库当中能够找到定义。但事实上一个动态库可能使用另一个动态库中定义的符号,这就要求我们在使用gcc命令的时候注意这两个动态库的在命令中的先后位置。关于动态库在编译命令行中的位置影响可以参考我的另一篇博文https://blog.csdn.net/J_H_C/article/details/88080146

2、解决方法

使用nm命令查看libclntsh.so,结果如下:

从结果可以看出:libicdbapi.so中未定义的符号其实是在libclntsh.so中定义的,所以在编译的时候需要指定libclntsh.so。而且要注意在指定动态库的时候不能将libclntsh.so放在libicdbapi.so之前。本文出现的问题就是因为编译的时候将libclntsh.so放在libicdbapi.so之前了。更改之后,make结果如下:

3、说明一下:libicdbapi.so是根据proc c/c++制作的一个访问oracle数据库的动态库,对于.pc文件使用proc编译器生成的.c文件在编译的时候需要指定libclntsh.so,可以参考我的另一篇博文https://blog.csdn.net/J_H_C/article/details/81037328

4、在将动态库的顺序调整好之后,发现一个问题:在我的ubuntu中有2个用户:cjh和peoject,我的oracle安装在cjh用户之下,而且libclntsh.so所在的路径已经被我添加到cjh和project的.bashrc文件的LD_LIBRARY_PATH之中了。

按道理讲我将动态库的顺序调整好后,在project用户下编译项目可以编译成功,但是却显示链接器找不到libclntsh.so,如下:

刚开始以为是权限问题,但是查看oracle安装目录下的libclntsh.so,发现权限是777,应该不存在权限问题。

还查看了libclntsh.so每一层目录,都显示是可以无论是所有者还是同组用户抑或是其他用户都至少是可以访问和执行的,没有权限问题。

     这个问题没有找到原因,对于这种要使用其他用户下的动态库最后还是复制到当前用户比较好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值