最近项目涉及的系统需要修改底层,需要重编译。那么依赖的第三方库如果没有提供 SDK 相关文件(头文件、库信息等),则也需要重新编译。
这里就记录一些 Linux 常用的库(包)管理相关指令。
TIPS:Linux关于包的参数
PATH:可执行文件路径
LIBRARY_PATH:编译期间的动态库查找路径
LD_LIBRARY_PATH:程序加载运行期间的动态库查找路径
PKG_CONFIG_PATH:pkg-config库信息存储路径
一、update-altnernatives
这是用于管理多版本的应用,如:python、java、cmake 这些常需要多版本切换的库/应用。实际上,这个命令是通过软链接的机制,对应用采用注册记录的方式实现的。
如:python服务
/usr/bin/python
↓
/etc/alternatives/python → /usr/bin/python2.7
↓
/usr/bin/python3.5
这里只介绍一些基本用法:
- display:参数显示关于 xxx 替换组的信息
1 2 3 4 5 6 7 |
$ update-alternatives --display deepstream-app deepstream-app -auto mode link best version is /opt/nvidia/deepstream/... link currentlty points to /opt/nvidia/deepstream/... link deepstream-app is /usr/bin/deepstream-app /opt/nvidia/deepstream/... -priority 40 ... |
- config:选择版本
1 2 3 4 5 |
$ update-alternatives --config python Selection Path Priority State 0 /usr/bin/python3.5 2 auto-mode * 1 /usr/bin/python2.7 1 manual-mode 2 /usr/bin/python3.6 3 manual-mode |
- install:参数用于添加一个命令的 link 值
1 2 3 4 5 6 7 8 |
$ update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2 (1) (2) (3) (4) (5) # (1): --install 表示向update-alternatives注册服务名 # (2): 注册的最终地址,成功后将会把命令在这个固定的目的地址做真实命令的软链接,以后管理的就是这个软链接 # (3): 服务名,以后管理以它为依据 # (4): 被管理的命令绝对路径 # (5): 优先级,数字越大优先度越高 |
- remove:参数用于删除一个命令的 link 值,其附带的 slave 也会一并删除
1 |
$ update-alternatives --remove python /usr/bin/python2.7 |
二、pkg-config
这是一个在源代码编译时常用于查询已安装的库的使用接口等信息的一种工具软件。
它输出已安装的库的相关信息:
- C/C++ 编译器所需的输入参数
- 链接器所需输入参数
- 已安装软件包的版本信息
当 install 一个库的时候(RPM、deb/其他二进制包),会包括一个后缀名为 pc 的文件,它会放入某文件夹下(依赖于当前系统设置),如 Linux 下的 /usr/lib/pkgconfig 和 /usr/local/lib/pkgconfig 中。
将文件中加入 pkg-config 环境变量 PKG_CONFIG_PATH 作为搜索路径,如在 ~/.bashrc 中加入:
1 |
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH |
在这个 .pc 文件里包含多个条目,这些条目通常包含 其他使用这个库的程序编译时所需的库信息 ,如:库信息(include、lib),版本信息,简介等。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# libfoo.so(动态库) <-> /usr/lib/x86_64-linux-gnu/pkgconfig/foo.pc $ cat /usr/lib/x86_64-linux-gnu/pkgconfig/foo.pc prefix=/usr/local exec_prefix=${prefix} includedir=${prefix}/include libdir=${prefix}/lib Name: foo Description: The foo library Version: 1.0.0 # --modversion Cflags: -I${includedir}/foo # --cflags Libs: -L${libdir} -lfoo # --libs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# xxx.a(静态库) <-> /usr/lib/x86_64-linux-gnu/pkgconfig/xxx.pc $ cat /usr/lib/x86_64-linux-gnu/pkgconfig/xxx.pc ... Name: xxx Description: ... Version: xxx.xxx.xxx Requires: Requies.private: Conflicts: Libs: 列出所有库 Libs.private: Cflags: -I${includedir} |