精辟!(/usr/bin/ld: cannot find -lxxx)可能出现的问题和原因

来源:互联网 发布:unity3d 体素 编辑:程序博客网 时间:2024/05/01 01:59
(/usr/bin/ld: cannot find -lxxx)  
转载注明出处:
http://www.eefocus.com/wicoboy/blog/13-03/292170_cdab5.html
问题描述
/usr/bin/ld: cannot find -lxxx
其中xxx即表示函式库文件名称,其命名规则是:lib+库名(即xxx)+.so
可能原因: 

1 安装了,但相对应的lib版本不兼容
——我们需要的是libjpeg.so.8.0但安装的是libjpeg.so.6.0,
——或者是需要arm平台上的lib,但我们安装的是X86架构的,或反之本来是要编译arm平台上的却忘了指定交叉编译器
——我们需要32位但我们安装的是64位的
2 安装了,版本也对了,但lib(.so.version-num)的symbolic link 不正确,没有连结到正确的函式库文件(.so)
——我们需要的是libjpeg.so.8.0,也安装上了,但是实际使用时我们是查找的libjpeg.so,就需要相应的一个名为libjpeg.so的link 指向libjpeg.so.8.0
3 目录中确实没有相对应的lib
——系统中没有安装相对应的lib
——安装了,但不在这个目录且不在环境变量中
遇到此类问题的解决思路:
一、先详细了解问题,注意看错误的详细信息以进一步确定,若出现类似下面提示: 
/usr/bin/ld: skipping incompatible /usr/local/jpeg-6b when searching for -libjpeg.so
问题:版本不兼容
1、32位 与 64位 冲突问题
案例:
解决 yum provides libX11.so
libX11-devel-1.3-2.el6.x86_64 : Development files for libX11
Repo : base
Matched from:
Filename : /usr/lib64/libX11.so
解决:
yum install libX11-devel-1.3-2.el6.x86_64
安装 x86_64 兼容包

2、平台不兼容ARM X86 

案例:
很可能是编译是忘了指定交叉编译工具
make CC=arm-xilinx-linux-gnueabi-gcc
或者手动修改Makefile中的CC
3、版本号不对
安装新的版本(一般会有具体的提示,要求是什么版本)
二、若非版本问题
进入相关目录查看是否是lib(.so.version-num)的symbolic link 不正确,并建立链接
案例:
cd /usr/lib
ln -s libjpeg.so.6 libjpeg.so
 
三、真的没有要找的libxxx.so
1、安装了但不在系统变量所设的目录
修改Makefile 在编译选项中添加Lyourlibpath
案例:
修改plugins/input_uvc/Makfile

修改
CFLAGS = -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC

CFLAGS = -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC-I/home/wu/jpeg-6b/jpeg/include 

 

修改
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

$(CC) $(CFLAGS) -ljpeg -L/home/wu/jpeg-6b/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

 

2、没安装
安装相关库 
先用yum 或apt-get search以确定库的确切名称
然后安装 
案例: 
sudo yum search libxtst-dev
sudo yum install libxtst-devel   
此问题所感
俗话说:对症下药,连别人是什么病都不知道,就开始给人开药方岂不可笑?

 

解决问题前先花时间研究问题。每个问题都有很多中可能的原因,以上这个简单的例子就可以说明问题,善于从一些错误提示和相关内容的字里行间去深入问题,对问题了解的越清楚,就越有利于定位问题,定位的越准就越利于快速解决问题。
0 0