源码安装的取舍
源码编译安装(configure、make、make install)绕开包管理器:能装到任意版本、自由选择编译选项,但升级、卸载与依赖追踪全靠自己。关键动作是隔离 prefix(例如 /opt/app-1.0),让文件集中在一处,既避免与系统包混在一起,也便于整目录清理。装完动态库还要让系统找得到,也就是写 /etc/ld.so.conf.d 再执行 ldconfig。
基本信息
| 适用平台 | Linux(autotools 的 configure/make;CMake 等构建体系同理) |
|---|---|
| 标准流程 | ./configure --prefix=... && make && make install |
| 关键文件 | /etc/ld.so.conf.d/*.conf 与 ld.so.cache |
| 依赖准备 | 编译工具链与 -devel / -dev 开发包 |
| 卸载 | 项目支持时用 make uninstall,否则按 prefix 目录清理 |
| 长期维护 | 能打包就打包(rpmbuild、dpkg-buildpackage、fpm) |
典型使用场景
- 需要发行版仓库里没有的版本(特定版本的编译器或中间件)
- 需要自定义编译选项(特性开关、优化参数)
- 内部自研程序交付部署
- 实验环境快速试装某个工具
- 临时替代有问题的系统包(应尽快回归包管理)
标准流程
标准流程
sudo dnf groupinstall 'Development Tools' # 先装编译工具链与常用开发包
./configure --prefix=/opt/app-1.0 # prefix 隔离,文件集中便于卸载
make -j$(nproc) # 并行编译加速
sudo make install
echo /opt/app-1.0/lib | sudo tee /etc/ld.so.conf.d/app.conf # 让动态库可被找到
sudo ldconfig # 刷新库缓存,否则运行期可能报找不到 so
ldd /opt/app-1.0/bin/app | grep 'not found' # 检查动态库是否全部可解析
cd build && sudo make uninstall # 项目支持时优先用官方卸载决策与做法
| 问题 | 做法 | 注意 |
|---|---|---|
| 用哪个版本 | 优先仓库包,其次官方 rpm/deb,最后才源码编译 | 源码安装的维护成本最高 |
| 装到哪里 | 独立 prefix,如 /opt/name-version | 集中便于卸载与多版本并存 |
| 依赖从哪来 | 用包管理器安装 -devel / -dev | 自己编译依赖会滚雪球 |
| 动态库找不到 | 写 /etc/ld.so.conf.d 后 ldconfig | 不要随手改动系统库路径 |
| 如何卸载 | make uninstall 或按 prefix 清目录 | 安装前先记录文件清单 |
| 长期维护 | 尽量打成包 | 散装进 /usr/local 是升级与审计的黑洞 |
编译前先确认开发包齐全:缺 -devel / -dev 时 configure 会在检查阶段失败,报错信息通常指向具体缺失的头文件或库,照着装就能继续。
不要用源码安装覆盖系统包管理的同名文件(例如把命令直接装到系统路径覆盖系统版本):系统包升级时会覆盖回去,版本与依赖关系彻底混乱且难以排查。