kernel编译报Can't use 'defined(@array)'问题

本文介绍了一种解决Linux3.3内核编译时出现的特定错误的方法,该错误与使用的Ubuntu版本有关。通过修改kernel/timeconst.pl文件中的某一行代码,可以在Ubuntu16.04上成功编译内核。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编译LINUX3.3内核时,报了一个  错误:

TIMEC   kernel/timeconst.h
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/mnt/WORKSPACE/omapl138/kernel/linux-3.3/kernel/Makefile:130: recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:945: recipe for target 'kernel' failed
make: *** [kernel] Error 2
make: *** 正在等待未完成的任务....
  CC      fs/super.o

最后调查发现是和所使用的UBUNTU版本有关系,在使用ubuntu 16.04编译时,报这个错误;

使用ubuntu 12.04编译时,不会报这个错误。

 

依照编译器的提示kernel/timeconst.pl line 373,在ubuntu16.04中可以通过修改kernel/timeconst.pl的第373行:

把if (!defined(@val))修改成

 #if (!defined(@val))
 if (!@val){
  @val = compute_values($hz);
 }

即可以修正这个问题。

之前看网页上有介绍可能和64位机器环境有关系,ubuntu16.04和ubuntu12.04都是32位的虚拟机,应该和64位无关。

### Perl 中数组的嵌套赋值语法解释 Perl 提供了一种灵活的方式来处理复杂的数组结构,其中包括数组的嵌套。对于表达式 `@array[@array] = @array` 的解析需要深入理解 Perl 对于切片(slice)的操作机制以及上下文中数组引用的行为。 #### 表达式的组成部分分析 - **左侧部分 (`@array[@array]`)** 左侧表示的是一个数组切片(array slice),其中外层的 `@array` 是目标数组的名字,而方括号中的另一个 `@array` 则是一个索引列表(index list)[^1]。这意味着该语句试图将右侧的结果分配到由内部 `@array` 所指定的一系列连续或不连续的位置上去。 - **右侧部分 (`@array`)** 右边简单的 `@array` 就是我们要复制其内容的一个源数组。它的每一个元素会依次被放置到左边所定义好的那些槽位里去填充它们[^2]。 #### 实际工作原理详解 当执行像这样的命令时: ```perl my @indices=(0,2); my @source=('a','b','c'); @a[@indices]=@source; ``` 这里发生了什么? 首先,@indices 被求值得到了两个数值:0 和 2 。接着 perl 开始准备把 @source 数组里的项目分别放到名为"a"的那个数组当中对应序号为0和2的地方。最终得到的效果如下所示: ```perl $a[0]='a'; $a[2]='c'; # 注意跳过了中间位置如果没有特别指派的话,默认保持不变或者可能是undef状态取决于具体情况 ``` 这种技术允许我们非常方便地一次性更新多个离散地址处的数据项而不是逐一手动设定每个单独的目标单元格内容[^3]。 #### 示例代码展示 下面给出一段完整的例子来演示这一特性是如何工作的: ```perl #!/usr/bin/perl use strict; use warnings; # Initialize some sample data structures. my @index_list = qw(0 2 4); my @value_set = ('X', 'Y', 'Z'); # Assign values according to index mapping defined earlier. my @target_array; @target_array[@index_list] = @value_set; # Output result set after assignment operation completed successfully. foreach my $i (0 .. $#target_array){ printf "[%d]:%s\n", $i ,defined($target_array[$i])?$target_array[$i]:'<UNDEF>'; } ``` 运行这段程序将会打印出类似于以下的信息流图谱: ``` [0]:X [1]:<UNDEF> [2]:Y [3]:<UNDEF> [4]:Z ``` 从中可以看出只有明确指出过的几个地方得到了新赋予的字母标记其余空白区域均维持现状未做任何改变动作[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值