-e linux_[Linux]找不到动态链接库和头文件问题
在Linux 系统中库文件分成静态库和共享库两种,静态库以.a作为后缀名,共享库以.so 结尾,所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本。
Cmake生成静态库
add_library(hello libHelloSLAM.cpp)
Cmake生成共享库
add_library(hello_shared SHARED libHelloSLAM.cpp)
如果仅有.a或.so 库文件,我们并不知道里面的函数到底是什么,调用的形式又是什么样,为了便于使用这个库,需要提供一个头文件,说明库里面都有些什么。
调用库时,需要在CMakeLists.txt中添加一个可执行程序生成命令,链接到刚才使用的库上
target_link_libraries(可执行文件名 库名)
Linux 系统中头文件一般位于 /usr/local/include中,库文件位于/usr/local/lib中
使用ldd命令查看可执行文件依赖的动态链接库:
若不存在动态链接库,则会显示 not found
查找所需库,然后编译安装,若已编译安装相关库却仍旧找不到该文件(系统中有.so文件,但因路径未设置正确而未找到)
(1)在系统中查找该文件
sudo find / -name xx.so // 其中“/”应该是根目录
(2)将.so文件路径的目录添加到 /etc/ld.so.conf
sudo vim /etc/ld.so.conf
在其中添加.so文件路径
/lib/x86_64-linux-gnu
(3)令更改生效
sudo /sbin/ldconfig
若头文件未找到,如LuaBridge,可以下载后将其拷贝至默认的头文件路径
sudo cp -r /home/xx/Download/LuaBridge/. /usr/local/include
附:
cp(选项)(参数) 选项
-a:此参数的效果和同时指定"-dpR"参数相同;
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;
-i:覆盖既有文件之前先询问用户;
-l:对源文件建立硬连接,而非复制文件;
-p:保留源文件或目录的属性;
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
-b:覆盖已存在的文件目标前将目标文件备份;
-v:详细显示命令执行的操作。