首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux 內核編譯報錯:kernel/timeconst.pl "defined(@array)" 語法錯誤解決方案

     編輯:程式設計綜合問答

錯誤現象

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
make[1]: *** [kernel/timeconst.h] Error 255

環境:Fedora 23 (64位),編譯 Linux 2.6.38 內核。

根因分析

Perl 版本不兼容。Perl 5.22+ 移除了 defined(@array) 和 defined(%hash) 的支援,直接使用數組/雜湊在布爾上下文中即可判斷是否為空。

  • 舊寫法:if (defined(@array))
  • 新寫法:if (@array)

Linux 2.6.38 (2011 年發布) 的腳本使用了已棄用語法,而 Fedora 23 預裝 Perl 5.22+。

解決方案

方案一:修補腳本(推薦,針對性強)

# 1. 備份原文件
cp kernel/timeconst.pl kernel/timeconst.pl.bak

# 2. 修改第 373 行及類似行
sed -i 's/defined(@\([a-zA-Z_][a-zA-Z0-9_]*\))/@\1/g' kernel/timeconst.pl
# 或手動編輯:
# 第 373 行:if (defined(@vals)) → if (@vals)
# 搜尋所有 defined(@xxx) 替換為 @xxx

方案二:降級 Perl(不推薦,影響系統)

# 安裝舊版 Perl(如 5.20)
# 使用 perlbrew 或從源碼編譯安裝到 /opt/perl-5.20
# 編譯內核時指定:make PERL=/opt/perl-5.20/bin/perl

方案三:升級內核版本(根治)

Linux 2.6.38 過於古老(EOL 2011),建議編譯**長期支援版**(LTS):

  • 5.15.x, 6.1.x, 6.6.x (當前活躍 LTS)
  • 內核官網:kernel.org

驗證修補效果

# 測試腳本語法
perl -c kernel/timeconst.pl
# 應輸出:kernel/timeconst.pl syntax OK

# 繼續編譯
make -j$(nproc)

深度補充:為什麼不建議改動內核源碼?

  • 內核編譯腳本屬於**構建系統**,非運行時代碼,修補構建腳本不影響內核功能
  • 但 2.6.38 缺少十年安全修補、硬體支援、文件系統改進
  • 嵌入式開發若受限於廠商 BSP,才被迫使用舊內核

總結

defined(@array) 錯誤是 **Perl 5.22+ 棄用語法**導致。快速修補:sed -i 's/defined(@\([a-zA-Z_][a-zA-Z0-9_]*\))/@\1/g' kernel/timeconst.pl。長期建議:**升級至現代 LTS 內核**,除非嵌入式 BSP 強綁定舊版本。內核編譯首選 make defconfig 產生默認配置,再 make menuconfig 微調,避免手動改動配置導致依賴缺失。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved