在Ubuntu下,编译Kernel报错:Makefile:xxx: recipe for target 'xxx' failed

本文详细介绍了在Ubuntu环境下编译Kernel时遇到的错误及其解决方法,主要问题在于缺少lzo和lzop工具,通过下载并安装这两个工具,可以成功解决编译失败的问题。

**在Ubuntu下,编译Kernel报如下错误:**
Makefile:xxx: recipe for target 'xxx' failed
make[2]:***[arch/arm/boot/compressed/piggy.lzo] Error 1
make[1]: ***[arch/arm/boot/compressed/vmlinux] Error 2
如下图所示:

原因:缺少工具lzo,lzop

解决:

1、lzo安装
        1)、wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
        2)、 sudo su  
                tar xzvf lzo-2.06.tar.gz 
        3)、cd lzo-2.06
            ./configure --enable-shared 
        4)、make
              make install
2、lzop安装:
        1)、wget 'http://www.lzop.org/download/lzop-1.03.tar.gz'
        2)、tar xzvf lzop-1.03.tar.gz 
        3)、cd lzop-1.03
            ./configure 
            ii)若出现configure: error: cannot compute sizeof (size_t)
                        See `config.log' for more details

            这个问题的原因是linux在查找动态链接库时,忽视了/usr/local/lib中一系列*.so,将其添加到配置文件中,就可以解决。

          解决办法(有root权限)

                1、打开/etc/ld.so.conf这个配置文件

                2、把下面这行内容添加进去

                /usr/local/lib

               3、保存文件,执行命令:/sbin/ldconfig

               4、make
                    make install

         (没有root权限)

                对于非root用户来说,/etc/ld.so.conf是read-only的,想要解决这个问题也是有办法的。在vim74目录下先执行如下命                  令:export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH // 为编译器设定额外的搜索路径,原理基本类                     似,修改ld.so.conf的根本原因只是为了让编译器在make过程中去对应的路径下寻找依赖,这里直接指定搜索路径,                   是一个效果。

              接下来, 就正常了
LZO介绍
LZO是致力于解压速度的一种数据压缩算法,LZO是Lempel-Ziv-Oberhumer的缩写。这个算法是无损算法,参考实现程序是线程安全的。

实现它的一个自由软件工具是lzop。最初的库是用ANSI C编写、并且遵从GNU通用公共许可证发布的。现在LZO有用于PerlPython以及Java的各种版本。代码版权的所有者是Markus F. X. J. Oberhumer。

LZO库实现了许多有下述特点的算法:

  • 解压简单,速度非常快。
  • 解压不需要内存。
  • 压缩相当地快。
  • 压缩需要64 kB的内存。
  • 允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。
  • 包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。
  • 另外还有一个只需要8 kB内存的压缩级别。
  • 算法是线程安全的。
  • 算法是无损的。

LZO支持重复压缩以及原地解压。

LZO是块压缩算法——压缩解压成块的数据。压缩与解压所用块的大小必须一样。

LZO将数据块压缩成匹配数据(滑动字典)与非匹配文字的序列。LZO对于较长的匹配数据以及较长的非匹配文字序列有专门的处理,这样对于高度冗余的数据能够取得很好的效果,并且对于不可压缩的数据也能得到可以接受的效果。

当处理不可压缩数据的时候,LZO将每个1024字节的输入数据块扩展16字节。

据报道LZO也在AIX、ConvexOS、IRIXMac OSPalm OS、 PS1(PlayStation)、SolarisSunOS、TOS(Atari ST)以及VxWorks上得到实现。

参考自:http://blog.sina.com.cn/s/blog_a336aee70102vlzy.html

<think>嗯,用户这次提出了一个非常具体的编译错误问题,关于"scripts/Makefile.build:337: recipe for target failed"。从用户引用和描述来看,ta应该是在Linux环境下进行内核或驱动编译时遇到了这个报错。用户提供了三个站内引用作为背景,但核心需求很明确:解决这个特定Makefile错误。 注意到用户可能是个开发者或系统管理员,正在尝试编译内核或相关组件。ta的提问方式很专业,直接给出了完整的错误信息片段,说明有一定技术基础。不过这个错误确实比较棘手,因为Makefile.build是内核编译系统的核心文件,报错指向的337行实际上是通用规则,真正的问题可能藏在更深层。 先快速回顾用户提供的引用线索:引用[1]提到arm架构压缩镜像构建失败,引用[2]是Qt编译时的目标覆盖警告,引用[3]则涉及OpenWrt配置工具构建问题。这些虽然场景不同,但共同点都是编译系统层级的问题,提示我需要从构建系统的角度分析。 这个错误的关键在于:Makefile.build第337行实际上是调用具体构建规则的通用模板,它报错意味着某个具体目标的构建命令执行失败了。就像快递公司通知"配送失败",但真正原因可能是收货人不在家、地址错误或货物损坏。所以必须找出原始失败点——通常错误日志里会有更早的报错信息。 用户可能已经尝试过基础排查(比如重新make),但问题依旧存在。考虑到ta特意提到这个行号,说不定已经搜索过但没找到直接解决方案。现在需要引导ta进行深度诊断: 首先应该确认失败的具体目标是什么。错误信息里"recipe for target XXX failed"的XXX就是关键线索,不过用户截取的信息里恰好缺失了这个XXX,这点需要提醒用户补充。就像医生问诊要知道具体哪个部位疼痛。 其次是检查前置依赖。内核编译经常因为缺失工具链组件(比如lzop)、配置冲突或头文件缺失导致这类失败。用户引用的案例1就涉及lzo压缩工具问题,案例3则是配置系统构建失败,这些都可能相关。 并行编译也是个常见雷区。make -j参数用得好能加速编译,但遇到依赖问题就容易中断。建议用户尝试单线程编译来排除并发问题,这和引用3的方案一致。 最后要考虑内核版本和环境的特殊性。比如ARM架构(引用1)可能需要额外检查交叉编译工具链,而OpenWrt(引用3)有自己独特的构建系统。用户没说明具体环境,需要提醒ta确认这些细节。 安全起见,应该给出渐进式排查路线:从最简单的清洁编译开始,逐步深入到工具链验证和日志分析。用户看起来比较着急(直接要解决方案),所以把最可能见效的"单线程编译"放在第一步,而需要动手修改的补丁方案放在最后。 特别要注意的是,所有命令示例都必须用中文说明加实际代码块呈现,因为用户展示过技术能力,可以直接操作终端。不过要避免信息过载,把grep命令示例放在最后作为进阶方案。 用户语气比较冷静专业,所以回复可以保持技术性,但要用"建议""可以尝试"等温和措辞。最后主动提出延伸帮助,因为编译问题往往需要多轮交互才能解决。 </think>编译时出现 `scripts/Makefile.build:337: recipe for target failed` 错误的解决方案需要根据具体上下文排查。该错误是 **Makefile 构建系统在编译过程中某个具体目标构建失败时触发的通用报错**,核心解决思路如下: --- ### 分步解决方案 1. **定位原始错误(关键步骤)** **`Makefile.build:337` 只是错误传递点,需向上查找真实错误源:** ```bash # 方法1:检查终端输出中 Makefile.build:337 之前的错误日志(通常是最后几行) # 方法2:重新编译并捕获完整日志(保存到文件): make clean # 清理之前的构建 make V=1 2>&1 | tee build.log # V=1 显示详细命令,输出保存到 build.log # 搜索 "error:" "undefined reference" 或 "No such file" 等关键词 ``` 2. **常见原因及对应修复** * **依赖缺失或工具链问题** - 检查报错目标是否缺少头文件(`.h`)或库文件(`.a`/`.so`) - 验证编译工具链完整性(如 `gcc`, `ld`, `flex`, `bison` 等): ```bash sudo apt update sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev # Ubuntu 常见依赖 ``` * **并行编译冲突(常见于 `make -jN`)** 尝试单线程编译排除并发问题: ```bash make -j1 # 强制单线程执行 ``` * **配置错误** - 若涉及内核/驱动:检查 `.config` 配置是否冲突 - 清理后重新配置: ```bash make clean make menuconfig # 或 defconfig make ``` * **源码/补丁问题** 确认源码是否完整(如 `git checkout` 后未应用补丁)或存在未合并的冲突标记(`<<<<<<< HEAD`)。 * **权限问题** 在 `sudo make` 和普通用户编译间切换可能导致权限混乱,彻底清理后重试: ```bash sudo make clean # 清理 root 编译的文件 make clean # 清理普通用户文件 chown -R user:group ./ # 修复源码目录所有权 make # 以普通用户编译 ``` 3. **进阶排查** ```bash # 定位具体失败的目标文件(示例) grep "recipe for target" build.log | grep -v Makefile.build # 检查目标文件的依赖树 make -n <target_name> # 显示构建该目标的命令(替换 <target_name> 为实际目标) ``` - 若涉及内核模块:检查 `obj-y`/`obj-m` 配置是否正确 [^3] - 若为外部驱动:验证 `Kbuild` 文件路径和符号导出 --- ### 问题总结 | **原因类型** | **典型表现** | **解决方向** | |--------------------|----------------------------|--------------------------| | 工具链缺失 | 命令未找到(`lzop`, `gcc`) | 安装对应开发包 | | 依赖文件丢失 | `No such file or directory` | 检查路径/生成顺序 | | 配置冲突 | 宏定义重复或未启用 | 调整 `.config` 或 Kconfig | | 并行编译错误 | 仅 `make -jN` 失败 | 改用 `-j1` 或修复依赖 | | 源码损坏 | 文件哈希校验失败 | 重新下载/应用补丁 | > ⚠️ 若以上步骤无效,请提供 **`Makefile.build:337` 错误之前的 10~20 行日志**,以便进一步分析具体目标。 --- ### 相关问题 1. 如何解读 Linux 内核编译中的 `make` 错误日志结构? 2. `make V=1` 和 `make V=sc` 参数在调试编译错误时有何区别? [^3] 3. Ubuntu编译内核必备的工具链有哪些? 4. 如何修复 `undefined reference to symbol` 类型的链接错误? [^1]: 编译错误通常源于工具链缺失或配置冲突 [^2]: 目标覆盖警告可能暗示规则重复定义 [^3]: 单线程编译 (`-j1`) 是诊断并行问题的有效手段
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值