跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Linux怎么编译安装软件_Linux如何从源码make install【教程】

若 ./configure 报“command not found”,先检查是否存在 configure 脚本(ls -F | grep configure),若无则需用 autoreconf -fiv 生成;确认已安装 autoconf、automake、libtool;注意项目可能使用 meson 或 cargo,应优先查阅 README.md。 configure 没找到怎么办 很多源码包解压后直接
./configure
报错“command not found”,不是你漏装了软件,而是这个脚本根本不存在——它得先生成。Autotools 项目(比如老版本的 nginx、httpd)通常只带
configure.ac
和
Makefile.am
,需要本地运行
autoreconf -fiv
生成
configure
脚本。 常见错误现象:
./configure: No such file or directory
;
autogen.sh not found
;
configure.ac: command not found
(其实是 bash 把
./configure.ac
当成命令执行了)。 先确认是否真有
configure
:运行
ls -F | grep configure
,看到
configure*
才说明已自带 没有的话,检查是否装了
autoconf
、
automake
、
libtool
(Ubuntu/Debian:
sudo apt install autoconf automake libtool
;CentOS/RHEL:
sudo dnf install autoconf automake libtool
) 有些项目用
meson
或
cargo
,别硬套
configure
——看
README.md
里写的构建方式,不是所有源码都走 Autotools make install 覆盖系统文件的风险
sudo make install
默认把二进制、头文件、配置模板全塞进
/usr/local/
,看起来安全,但一旦你之前用包管理器(apt/dnf)装过同名软件,就可能引发冲突:比如
/usr/local/bin/python3
覆盖了系统
/usr/bin/python3
的符号链接,导致
apt upgrade
失败或桌面环境启动异常。 使用场景:你想试用新版本 Redis,但又不敢动系统已有的
redis-server
;或者编译一个自定义打补丁的 Nginx,只想让它在测试环境跑。 永远优先加
--prefix
:比如
./configure --prefix=$HOME/local
,然后把
$HOME/local/bin
加进
$PATH
不要用
sudo make install
往
/usr
或
/usr/local
写,除非你清楚每个安装路径的作用,且愿意手动维护 想卸载?
make uninstall
大概率不存在——Autotools 默认不提供,得靠你记下
make install
输出的每行路径,或提前用
checkinstall
打包成 deb/rpm 找不到依赖头文件或库(fatal error: xxx.h: No such file or directory) 这问题不是编译器坏了,是开发头文件没装。Linux 发行版把运行时库(如
libssl.so
)和开发头文件(如
openssl/ssl.h
)拆成两个包:用户装
openssl
,开发者得额外装
libssl-dev
(Debian/Ubuntu)或
openssl-devel
(RHEL/CentOS/Fedora)。 参数差异:
pkg-config
查不到,
gcc -I
手动指定路径又容易漏,不如让
configure
自己发现。 先运行
./configure --help | grep -E "(with|enable)"
,看有没有禁用某模块的开关(比如
--without-zlib
),临时跳过报错依赖 查缺的头文件属于哪个包:
apt-file search ssl.h
(需先
sudo apt install apt-file && sudo apt-file update
);RHEL 系用
dnf provides '*/ssl.h'
某些库路径不在默认搜索范围(比如自己编译装到
/opt/openssl
),就得显式告诉 configure:
./configure --with-openssl=/opt/openssl PKG_CONFIG_PATH=/opt/openssl/lib/pkgconfig
make -j 多线程编译崩了怎么办
make -j$(nproc)
看起来快,但不少旧项目 Makefile 没写好依赖顺序,一并行就出错,典型表现是
undefined reference to 'xxx'
或
file not found
(明明刚生成的 .o 文件还没来得及链接)。 性能影响:现代 CPU 上
-j4
通常比
-j1
快 2–3 倍;但若频繁失败重试,反而更慢。 首次编译一律用
make -j1
,确保流程通得过 确认没问题后再试
make -j$(nproc)
;如果崩了,别改 Makefile,先
make clean
再重来 有些项目支持
make -k
(继续执行后续目标),但对依赖断裂无效,不如老实用单线程 最麻烦的从来不是命令敲不对,而是你以为 configure 成功了,其实它悄悄跳过了某个关键模块(比如提示
checking for zlib... no
却继续往下走),结果 make 出来的程序一运行就 core dump。盯紧 configure 的每一行输出,别只看最后的 “yes”。

相关文章