04-----关于/usr/bin/ld: skipping incompatible /xxx/libmysqlclient.so when searching for -lmysql

出现这个问题,可能由多种情况导致的,我自己遇到过两种情况:

第一种:

原因是库是32bit的,但是我们系统本身是64bit的,导致链接时出错。或者有另一种解释,在64位系统中,/usr/lib/mysql/下的相关库文件无法标识,需要将/usr/lib64/mysql下的库来做个软链接。
可以通过查看linux系統的位數进行比较,在shell中輸入:

getconf LONG_BIT

然后查看库的位数:

readelf -h libxxxxxx.so

在这里插入图片描述

然后对lib64下的mysql做相关软链接即可。

ln -sf /usr/lib64/mysql/libmysqlclient.so /usr/lib/mysql/libmysqlclient.so
ln -sf /usr/lib64/mysql/libmysqlclient.a /usr/lib/mysql/libmysqlclient.a  

第二种:

由于我在出现这种情况的时候,通过上面的两个命令对比,发现库和系统的位数都是64bit的,并且我在其它项目中mysql库都是能用的,所以肯定排除是问题1导致的。
然后进行排查。排查过程如下:

#查找系统对应的库,由于我自己项目拷贝了一份mysql,所以对比系统的库发现,两者的版本是不一致的。
find / -name libmysql*

项目中的mysql的是xxx.so.20.3.8,而系统的mysql库是xxx.so.20.3.17,于是果断替换项目的为系统最新版本的xxx.so.20.3.17。
在这里插入图片描述

重新编译,发现果然不再报skipping incompatible的错误。

不过出现了另一个问题,出现了下面一大堆的链接错误。

undefined reference to `mysql_init@'
undefined reference to `mysql_close@'

上面的错误很常见,基本就是链接库路径写错或者动态库不存在,但是我检查了是正常的。
所以从makefile的编译库的顺序查找。

$(CC) -L$(LINK_DIRECTORIES_libevent) -l$(TARGET_event1) -l$(TARGET_event2) -l$(TARGET_event3) -l$(TARGET_event4) \
	 	-l$(TARGET_event5) -L$(LINK_DIRECTORIES_mysql) -l$(TARGET_mysql) -L$(LINK_DIRECTORIES_onvif) -l$(TARGET_onvif) -l$(TARGET_pthread) $^ -o $@
	 	
改成下面:
$(CC) $^ -o $@ -L$(LINK_DIRECTORIES_libevent) -l$(TARGET_event1) -l$(TARGET_event2) -l$(TARGET_event3) -l$(TARGET_event4) \
	 	-l$(TARGET_event5) -L$(LINK_DIRECTORIES_mysql) -l$(TARGET_mysql) -L$(LINK_DIRECTORIES_onvif) -l$(TARGET_onvif) -l$(TARGET_pthread)

按照上面改后,马上OK,原因是动态库的路径查找从右到左,如果先执行可执行文件再链接库就可能出错。
不过有的系统就是是按照第1种写法也不会报错,例如我在x86就不会,但是移植到arm架构就出错了,为了适配其它系统,最好将链接库路径写在最后,避免不必要的麻烦。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值