内核编译出错:multiple target patterns

本文记录了一次在构建Linux内核时遇到的make失败问题及解决过程。问题表现为make操作后出现错误,通过深入分析Makefile并尝试不同命令,最终发现删除特定文件可以解决问题。
原文地址: http://blog.youkuaiyun.com/zjujoe/article/details/3185382

现象

 svn 仓库check out 一份内核, 然后make (该配置内置了initramfs 文件系统),第一次make 成功, 但是此后再也不行了!make , make clean 等后都会出错。给开发带来极大麻烦。

 

出错信息如下:

20081007_kernel>make

  CHK     include/linux/version.h

make[1]:`include/asm-arm/mach-types.h' is up to date.

  CHK     include/linux/utsrelease.h

  CHK     include/linux/compile.h

/home/zjujoe/svn/mhlv_2.6/working/songlixin/20081007_kernel/usr/Makefile:41:*** multiple target patterns.  Stop.

make: *** [usr] Error2

 

20081007_kernel>make clean

  CLEAN   arch/arm/boot/compressed

  CLEAN   arch/arm/boot

  CLEAN   /home/zjujoe/svn/mhlv_2.6/working/songlixin/20081007_kernel

  CLEAN   arch/arm/kernel

  CLEAN   drivers/char

  CLEAN   init

  CLEAN   lib

/home/zjujoe/svn/mhlv_2.6/working/songlixin/20081007_kernel/usr/Makefile:41:*** multiple target patterns.  Stop.

make: *** [_clean_usr] Error2

 

20081007_kernel>makedistclean

/home/zjujoe/svn/mhlv_2.6/working/songlixin/20081007_kernel/usr/Makefile:41:*** multiple target patterns.  Stop.

make: *** [_clean_usr] Error2

 

 

问题解决

(同时打算再仔细研究一下 Makefile 语法:P)

google 了一下, 查到文档:

http://www.ibm.com/developerworks/cn/linux/l-debugmake.html

 

该文档说make 时使用  -d 参数可以看到大量信息, 试着用 make–d, 最后几行:

This program built fori486-pc-linux-gnu

Reading makefiles...

Reading makefile`scripts/Makefile.build'...

Reading makefile`include/config/auto.conf' (search path) (don't care) (no ~expansion)...

Reading makefile`scripts/Kbuild.include' (search path) (no ~expansion)...

Reading makefile`/home/zjujoe/svn/mhlv_2.6/working/songlixin/20081007_kernel/usr/Makefile'(search path) (no ~ expansion)...

Reading makefile`usr/.initramfs_data.cpio.gz.d' (search path) (no ~expansion)...

/home/zjujoe/svn/mhlv_2.6/working/songlixin/20081007_kernel/usr/Makefile:41:*** multiple target patterns.  Stop.

Reaping losing child 0x080af520PID 6349

make: *** [usr] Error2

Removing child 0x080af520 PID6349 from chain.

 

看一下,usr/.initramfs_data.cpio.gz.d initramfs 的目录列表,

试着删除文件 usr/.initramfs_data.cpio.gz.d  Make, 居然不出错了!!!

 

20081007_kernel>rm -fusr/.initramfs_data.cpio.gz.d

20081007_kernel>make

  CHK     include/linux/version.h

make[1]:`include/asm-arm/mach-types.h' is up to date.

  CHK     include/linux/utsrelease.h

  CHK     include/linux/compile.h

  MODPOSTvmlinux

  Kernel:arch/arm/boot/Image is ready

  Kernel:arch/arm/boot/zImage is ready

  Building modules, stage2.

  MODPOST 33modules

### e²studio中解决'multiple target patterns'错误的方案 在e²studio中,`make`命令出现`multiple target patterns`错误通常是由于Makefile语法问题引起的。此错误通常发生在规则的目标定义不正确或存在多个目标模式的情况下[^1]。 以下是一个可能的解决方案: #### 1. 检查Makefile中的目标定义 确保Makefile中的每条规则只有一个目标,并且目标模式没有重复定义。例如,以下规则会导致`multiple target patterns`错误: ```makefile $(OBJ_DIR)/%.o: %.c %.h $(CC) -c $< -o $@ ``` 上述规则中,`%.c`和`%.h`同时作为依赖项,可能会导致冲突。应修改为以下形式: ```makefile $(OBJ_DIR)/%.o: %.c $(CC) -c $< -o $@ ``` #### 2. 确保变量定义正确 检查Makefile中是否有变量被多次赋值或覆盖,这可能导致目标模式解析失败。例如: ```makefile OBJ_FILES = main.o util.o OBJ_FILES += math.o ``` 如果变量`OBJ_FILES`被多次重新定义,可能会导致目标模式冲突。建议使用`+=`操作符来追加值[^2]。 #### 3. 避免通配符的误用 在Makefile中使用通配符时,需确保其范围明确且不会产生歧义。例如: ```makefile all: $(wildcard *.c) ``` 如果目录中有多个`.c`文件,可能会导致目标模式冲突。建议明确列出目标文件: ```makefile all: main.o util.o math.o ``` #### 4. 使用正确的依赖管理工具 如果项目较大,建议使用`CMake`或`Autotools`生成Makefile,以减少手动配置错误的可能性。例如,使用`CMake`可以简化依赖关系的管理: ```cmake add_executable(my_program main.c util.c math.c) ``` #### 示例代码:修正后的Makefile 以下是一个修正后的Makefile示例: ```makefile CC = gcc CFLAGS = -Wall -g OBJ_DIR = obj SRC_DIR = src TARGET = my_program OBJ_FILES = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(wildcard $(SRC_DIR)/*.c)) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ $(TARGET): $(OBJ_FILES) $(CC) $(OBJ_FILES) -o $@ clean: rm -rf $(OBJ_DIR) $(TARGET) ``` 通过以上方法,可以有效避免`multiple target patterns`错误的发生。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值