出现这个问题,可能由多种情况导致的,我自己遇到过两种情况:
第一种:
原因是库是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架构就出错了,为了适配其它系统,最好将链接库路径写在最后,避免不必要的麻烦。