【关于源码安装部署的三个步骤解析:预编译(./XXX),编译(make),安装(make install)】

文章详细阐述了源码安装的三个关键步骤:预编译(如运行./configure)用于检测系统依赖和创建Makefile,编译(make)根据Makefile将源码转化为二进制文件,以及安装(makeinstall)将编译后的文件部署到指定目录。以Nginx源码安装为例,解释了配置参数的作用和安装过程。

关于源码安装部署的三个步骤解析:预编译(./XXX),编译(make),安装(make install)

前言
相信很多Linux小白对于源码安装的步骤都十分熟练了,但是知其然是否也知其所以然呢?那今天就由我庖丁解牛-源码安装的三个步骤:预编译(./XXX),编译(make),安装(make install);看看三个步骤分别是个什么目的!

1.为什么需要执行三个步骤?

  • 源码安装必然安装的是源码包,源码包往往指的是由C,或C++等语言写的包,它们往往要比yum和rpm复杂,因此安装需要进行编译安装。
  • 就比如源码安装Nginx,因为Nginx是基于C语言开发的源代码程序,默认不能被Linux系统直接使用,需借助C编译器将源代码文件编译生成二进制文件,所以需执行源代码软件包部署核心三个步骤。

2.预编译的目的

  • 主要是检测Linux系统安装该所需的依赖环境、库文件,检测Linux系统是否存在GCC(C编译器),指定软件部署的路径、自定义软件编译参数、模块,最终产生Makefile文件。
    例如nginx预编译命令:
./configure --prefix=/usr/local/nginx/ --user=www --group=www --with-http_stub_status_module

参数解析:

./configure    ##预编译
 --prefix=/usr/local/nginx/   ##指定部署路径
 --user=www --group=www   ##指定所属用户和组
  --with-http_stub_status_module   ##检测所须依赖

make[1]: 进入目录“/home/ubuntu/Project/sym/SymphonyNo1_DataAquisition” g++ src/SymphonyNo1_DataAquisition.o -o build/SymphonyNo1_DataAquisition -pthread -I./inc -I../SymphonyNo1_Lib/Helper/inc -I../SymphonyNo1_Lib/Sym/inc -I../SymphonyNo1_IPC/Interface/inc -I../SymphonyNo1_IPC/PubSub/inc -I../SymphonyNo1_IPC/PushPull/inc -I../SymphonyNo1_Lib/DataAquisition/inc -L../SymphonyNo1_Lib/Helper/build -L../SymphonyNo1_Lib/Sym/build -L../SymphonyNo1_IPC/PubSub/build -L../SymphonyNo1_IPC/PushPull/build -L../SymphonyNo1_Lib/DataAquisition/build -lzmq -lhelper -lps -lpp -lsym -lda -std=c++17 -Wall -Wextra /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_close' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_new_rtu' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_free' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_read_registers' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `ModbusProtocol::ModbusProtocol()' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_connect' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_set_response_timeout' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_write_registers' /usr/bin/ld: ../SymphonyNo1_Lib/DataAquisition/build/libda.so: undefined reference to `modbus_new_tcp' collect2: error: ld returned 1 exit status make[1]: *** [../App.mk:11:build/SymphonyNo1_DataAquisition] 错误 1 make[1]: 离开目录“/home/ubuntu/Project/sym/SymphonyNo1_DataAquisition” make: *** [Makefile:43:symda] 错误 2
03-28
你遇到的这个错误: ``` "mkimage" command not found - U-Boot images will not be built arch/arm/boot/Makefile:90: recipe for target 'arch/arm/boot/uImage' failed make-4.1[2]: *** [arch/arm/boot/uImage] Error 1 make[1]: *** [uImage] Error 2 arch/arm/Makefile:332: recipe for target 'uImage' failed make[1]: Leaving directory '/home/user/NT98331_SDK/software/board/na51103_linux_sdk/BSP/linux-kernel' linux: Build finish Makefile:648: include/config/auto.conf: No such file or directory Makefile:701: include/config/auto.conf.cmd: No such file or directory In file included from ./include/linux/kernel.h:14, from ./include/linux/list.h:9, from ./include/linux/module.h:12, from net/core/skbuff.c:37: ``` 这是一个典型的 **嵌入式 Linux 内核编译失败问题**,我们来一步步分析并解决。 --- ## ✅ 错误分解 + 解决方案 ### ❌ 错误 1:`"mkimage" command not found` 这是最核心的问题! > `mkimage` 是 U-Boot 提供的一个工具(全称:`uboot-mkimage` 或 `u-boot-tools` 包的一部分),用于生成 `uImage` 格式的内核镜像。 #### 🔧 原因: 你的系统没有安装 `u-boot-tools`,所以无法找到 `mkimage` 命令。 #### ✅ 解决方法(Ubuntu/Debian 系统): ```bash sudo apt update sudo apt install u-boot-tools -y ``` > 安装后会提供 `/usr/bin/mkimage` 或现代版本中叫 `mkimage` 的符号链接。 📌 注意:某些新版本 U-Boot 已将 `mkimage` 改名为 `fit_image` 或集成到 `mkenvimage` 中,但大多数 SDK 仍使用旧名。可以通过以下命令确认是否安装成功: ```bash which mkimage # 或者 which mkimage || which uboot-mkimage ``` 如果提示找不到,说明没装对。 --- ### ❌ 错误 2:`recipe for target 'uImage' failed` 这是因为 Makefile 尝试构建 `uImage` 镜像时调用了 `mkimage`,但由于上面的原因命令不存在,导致失败。 #### ✅ 解决方法: 安装完 `u-boot-tools` 后重新编译即可。 --- ### ❌ 错误 3:`include/config/auto.conf: No such file or directory` 这表示 **内核配置未生成**。 也就是说你在执行 `make uImage` 之前,**没有先执行内核配置命令**(如 `make menuconfig`、`make xxx_defconfig`)。 #### ✅ 正确流程应该是: ```bash cd /home/user/NT98331_SDK/software/board/na51103_linux_sdk/BSP/linux-kernel make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- na51103_defconfig # 替换为实际 defconfig 名字 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage -j$(nproc) ``` ⚠️ 关键点: - 必须先运行 `defconfig` 来生成 `.config` 文件 → 进而生成 `include/config/auto.conf` - 否则直接 `make uImage` 会报路径缺失错误 🔍 如何知道用哪个 `_defconfig`? 查看目录: ```bash ls arch/arm/configs/ | grep -i na51103 # 输出可能是: # na51103_defconfig ``` 然后使用它: ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- na51103_defconfig ``` --- ### ❌ 错误 4:头文件报错(kernel.h, list.h 等) ``` In file included from ./include/linux/kernel.h:14, from ./include/linux/list.h:9, ... ``` 这类错误通常是 **前面配置失败导致的连锁反应** —— 因为 `.config` 没生成,编译器不知道如何包含头文件。 ✅ 只要你先正确执行了 `make xxx_defconfig`,这个问题就会自动消失。 --- ## ✅ 总结:完整修复步骤 ```bash # Step 1: 安装 mkimage 工具 sudo apt update sudo apt install u-boot-tools -y # Step 2: 进入内核源码目录 cd /home/user/NT98331_SDK/software/board/na51103_linux_sdk/BSP/linux-kernel # Step 3: 设置交叉编译工具链(根据实际情况调整) export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- # Step 4: 加载默认配置(请确认准确的 defconfig 名称) make na51103_defconfig # 如果不行,尝试: # make menuconfig # 手动保存一个 .config # Step 5: 编译 uImage make uImage -j$(nproc) ``` ✅ 成功后你会在 `arch/arm/boot/` 目录下看到生成的 `uImage` 文件。 --- ## ✅ 补充建议 ### 🛠️ 如果你不想生成 uImage? 有些项目允许只生成普通的压缩内核镜像(如 `zImage`),可以修改 Makefile 注释掉 `mkimage` 调用,或者改用: ```bash make zImage ``` 但通常 Bootloader(U-Boot)需要 `uImage` 格式才能启动,所以推荐保留。 --- ### 💡 查看当前是否已安装 mkimage ```bash dpkg -l | grep u-boot-tools # 或 which mkimage ``` 如果没有,重装: ```bash sudo apt install --reinstall u-boot-tools ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉里看星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值