Ubuntu 编译 /usr/bin/ld: cannot find 问题解决
Linux下编译应用程序常常会出现如下错误:
/usr/bin/ld: cannot find -lxxx意思是编译过程找不到对应库文件。其中,-lxxx表示链接库文件 libxxx.so。
注:有时候,由于库文件是编译过程临时生成的,如果前面出错也会导致出现这种情况,下面针对的是由于本机系统环境缺失而引起的。
一般出现这种错误有以下几种原因:
1.系统缺乏对应的库文件;
2.版本不对应;
3.库文件的链接错误;
4.库文件路径设置问题;
对应第一第二种情况,可以通过下载安装lib来解决,Ubuntu大多数可以直接通过apt-get来安装:
apt-get install libxxx-dev
一般遇到这种问题笔者第一时间也是会去检查系统是否已安装该lib或者是否已选择正确版本(只是习惯问题),如果还是不能解决问题,那么,引起错误的原因不是链接错误就是库文件路径问题了。
通过find指令定位到链接文件,查看链接文件是否正确的指向了我们希望的lib,如果不是,用 ln -sf */libxxx.so.x */libxxx.so 指令修改它。
如果是库文件路径引发的问题,可以到/etc/ld.so.conf.d目录下,修改其中任意一份conf文件,(可以自建conf,以方便识别)将lib所在目录写进去,然后在终端输入 ldconfig 更新缓存。
例子:手动编译wpa supplicant
要想自己编译wpa supplicant,当然需要source code,可以通过下面的命令获取:
git clone git://w1.fi/srv/git/hostap.git
当然,这个git仓库中不仅仅有wpa supplicant,还有hostap程序,不过这个程序和本文无关,略过。wpa supplicant是依赖libnl(netlink lib)和libssl(open ssl lib)这两个库的,因此我们首先要安装libnl和libssl的开发包:
sudo apt-get install libnl-3-dev
sudo apt-get install libssl-dev
安装完毕libnl和libssl的库文件以及必要的头文件之后,下面我们准备为wpa supplicant选择feature(wpa supplicant功能太多,你只需要选择你需要的功能)。配置文件是hostap/wpa_supplicant/目录下的.config文件,我们可以从缺省的配置文件开始,命令如下:
cp defconfig .config
defconfig是wap supplicant源代码自己带的配置文件,我们以它为起点,对.config文件进行编辑。当然,其配置项目很多,我们简单描述其中几个:
CONFIG_DRIVER_NL80211=y --------------(1)
CONFIG_CTRL_IFACE=y-----------------(2)
CONFIG_WPS=y
CONFIG_P2P=y---------------------(3)
CONFIG_AP=y
(1)wap supplicant是用户空间的程序,那么它是通过什么样子的接口和内核态的wifi网卡驱动进行通信呢?早期的接口叫做Linux wireless extension(对应CONFIG_DRIVER_WEXT),是一种ioctl type的接口。当netlink这种简单又好用的接口出现的时候,nl80211这样新的接口定义也随之而来。这个选项是用来配置wpa supplicant是否支持nl80211类型的driver。还有若干CONFIG_DRIVER_*的配置项,大家自行阅读注释就OK了。
(2)wap supplicant是一个daemon,可以提供各种服务,而wpa cli是一个客户端程序,可以通过命令行的方式来和wpa supplicant daemon进行交互,交互的管道是什么呢?CONFIG_CTRL_IFACE就是用来配置这个通信用的管道,具体的术语叫做control interface。
(3)是否支持WiFi直连(Wi-Fi Direct)。这是一个很有意思的功能,后续可以另起一篇文章专门描述之。
大概的概念就是类似,大家可以自己试着进行配置。选择了feature list之后,还需要修改一些库和头文件的路径,其实主要就是配置libnl和libssl的路径,如下:
CFLAGS += -I/usr/include/libnl3------------for libnl
LIBS += -L/lib/x86-64-linux-gnueabihf
CONFIG_LIBNL32=y-------配置libnl的版本
CFLAGS += -I/usr/include/openssl----------for libssl
LIBS += -L/lib/x86-64-linux-gnueabihf
然后make
可是出现以下错误:
/usr/bin/ld: cannot find -lnl-genl-3
collect2: error: ld returned 1 exit status
make: *** [wpa_supplicant] Error 1
所以根据以上解决方法:
/usr/bin/ld: cannot find -lxxx意思是编译过程找不到对应库文件。其中,-lxxx表示链接库文件 libxxx.so。
即缺少libnl-genl-3.so动态库
可以通过下载安装lib来解决,Ubuntu大多数可以直接通过apt-get来安装:
apt-get install libxxx-dev
即apt-get install libnl-genl-3-dev
然后再编译通过
浙公网安备 33010602011771号