1.在原先的库路径上添加路径:
原先的链接库$LD_LIBRARY_PATH
查看库的路径:
echo $LD_LIBRARY_PATH
设置库的路径,这里的设置在原来路径之上添加,可以看到保留了原来的$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/robot/lib:/opt/ros/lib:$LD_LIBRARY_PATH
2.设置环境的目录:
echo $PATH
export PATH=/usr/local/robot/sbin:$PATH
3.如果出现库冲突的情况,即在多个目录下有同样的库名,则连接时会找错
通过上述两个的PATH和LD设置,也许能解决某个库的冲突,但是并不非常高效,这时解决方法:在cmake中 使用-Wl,-rpath参数
可以通过以下指令
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -w -Wl,-rpath=/usr/lib:usr/local/lib:/usr/lib/x86_64-linux-gnu")
在其中找到库的位置,即可实现对此程序的库查找。
4.如何查找指定的库:
问题如下:undefined symbol:通常就是库对不上
./Hello: symbol lookup error: ./Hello: undefined symbol: _ZN6google21kLogSiteUninitializedE
看这量的名字,有点像是glog的,因此就查找glog哪个版本中包含_ZN6google21kLogSiteUninitializedE 这个量,然后对应链接即可
(1)
ldd Hello
找到当前运行时连接的glog
(2)
locate glog
/usr/lib/x86_64-linux-gnu/libglog.a
/usr/lib/x86_64-linux-gnu/libglog.so
/usr/lib/x86_64-linux-gnu/libglog.so.0
/usr/lib/x86_64-linux-gnu/libglog.so.0.0.0
/usr/lib/x86_64-linux-gnu/pkgconfig/libglog.pc
/usr/local/robot/lib/libglog.so
/usr/local/robot/lib/libglog.so.0
通过ldd可知程序运行链接的是robot下的glog,既然运行程序报error,说明robot下面的glog不包含_ZN6google21kLogSiteUninitializedE这个量,怀疑是在别的库包含这个量
nm -D /usr/lib/x86_64-linux-gnu/libglog.so | grep _ZN6google21kLogSiteUninitializedE
返回的结果为
000000000021e3b8 D _ZN6google21kLogSiteUninitializedE
说明应该链接 /usr/lib/x86_64-linux-gnu/libglog.so该库,
通过在cmakelists 文件中添加 -Wl,-rpath参数指定位置可解决该问题。