浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息
1. 常見的錯誤信息
make 執行過程中所產生錯誤并不都是致命的,特別是在命令行之前存在 -、或者 make 使用 -k 選項執行時。
make 執行過程的致命錯誤都帶有前綴字符串 ***。錯誤信息都有前綴,一種是執行程序名作為錯誤前綴(通常是 make);另外一種是當 Makefile 本身存在語法錯誤無法被 make 解析并執行時,前綴包含了 Makefile 文件名和出現錯誤的行號。
在下述的錯誤列表中,省略了普通前綴:
[FOO] Error NN
[FOO] signal description
這類錯誤并不是 make 的真正錯誤。它表示 make 檢測到 make 所調用的作為執行命令的程序返回一個非零狀態(Error NN),或者此命令程序以非正常方式退出(攜帶某種信號)。
如果錯誤信息中沒有附加 *** 字符串,則是子過程的調用失敗,如果 Makefile 中此命令有前綴 -,make 會忽略這個錯誤。
- missing separator.
missing separator. Stop.
missing separator (did you mean TAB instead of 8 spaces?). Stop.
錯誤的原因:不可識別的命令行,make 在讀取 Makefile 過程中不能解析其中包含的內容。GNU make 在讀取 Makefile 時根據各種分隔符( : , = , [TAB] 字符等)來識別 Makefile 的每一行內容。這些錯誤意味著 make 不能發現一個合法的分隔符。
出現這些錯誤信息的可能的原因是(或許是編輯器,絕大部分是ms- windows的編輯器)在 Makefile 中的命令之前使用了4個(或者8個)空格代替了 [Tab] 字符。這種情況,將產生上述的第二種形式產生錯誤信息。且記,所有的命令行都應該是以 [Tab] 字符開始的。
- commands commence before first target
commands commence before first target. Stop.
Makefile 可能是以命令行開始:以 [Tab] 字符開始,但不是一個合法的命令行(例如,一個變量的賦值)。命令行必須和規則一一對應。
- missing rule
missing rule before commands. Stop.
錯誤的原因可能是一行的第一個非空字符為分號,make 會認為此處遺漏了規則的 target: prerequisite 部分。
- No rule
No rule to make target 'XXX'.
No rule to make target 'XXX ', needed by 'yyy'.
無法為重建目標“XXX”找到合適的規則,包括明確規則和隱含規則。
修正這個錯誤的方法是:在 Makefile 中添加一個重建目標的規則。其它可能導致這些錯誤的原因是 Makefile 中文件名拼寫錯誤,或者破壞了源文件樹(一個文件不能被重建,可能是由于依賴文件的問題)。
- No targets
No targets specified and no makefile found. Stop.
No targets. Stop.
第一個錯誤表示在命令行中沒有指定需要重建的目標,并且 make 不能讀入任何 Makefile 文件。
第二個錯誤表示能夠找到 Makefile 文件,但沒有終極目標或者沒有在命令行中指出需要重建的目標。這種情況下,make 什么也不做。
- Makefile not found.
Makefile 'XXX' was not found.
Included makefile 'XXX' was not found.
沒有使用 -f 指定 Makefile 文件,make 不能在當前目錄下找到默認 Makefile( makefile 或者 GNUmakefile )。使用 -f 指定文件,但不能讀取這個指定的 Makefile文件。
- overriding commands for target
warning: overriding commands for target 'XXX'
對同一目標 XXX 存在一個以上的重建命令。GNU make 規定:當同一個文件作為多個規則的目標時,只能有一個規則定義重建它的命令(雙冒號規則除外)。如果為一個目標多次指定了相同或者不同的命令,就會產生第一個告警;
- gnoring old commands for target
warning: ignoring old commands for target 'XXX'
告警信息說新指定的命令覆蓋了上一次指定的命令。
- dependency dropped
Circular XXX <- YYY dependency dropped.
規則的依賴關系產生了循環:目標 XXX 的依賴文件為 YYY,而依賴 YYY 的依賴列表中又包含 XXX。
- Recursive variable references itself
Recursive variable 'XXX' references itself (eventually). Stop.
make 的變量 XXX(遞歸展開式)在替換展開時,引用它自身。無論對于直接展開式變量(通過 := 定義的)或追加定義( += ),這都是不允許的。
- Unterminated variable reference
Unterminated variable reference. Stop.
變量或者函數引用語法不正確,沒有使用完整的的括號(缺少左括號或者右括號)。
- insufficient arguments to function
insufficient arguments to function 'XXX'. Stop.
函數 XXX 引用時參數數目不正確。函數缺少參數。
- pattern 相關錯誤
missing target pattern. Stop.
multiple target patterns. Stop.
target pattern contains no '%'. Stop.
mixed implicit and static pattern rules. Stop.
不正確的靜態模式規則。
第一條錯誤的原因是:靜態模式規則的目標段中沒有模式目標;
第二條錯誤的原因是:靜態模式規則的目標段中存在多個模式目標;
第三條錯誤的原因是:靜態模式規則的目標段目標模式中沒有包含模式字符“%”;
第四條錯誤的原因是:靜態模式規則的三部分都包含了模式字符“%”。正確的應該是只有后兩個才可以包含模式字符“%”。
- -jN forced in submake
warning: -jN forced in submake: disabling jobserver mode.
這一條告警和下條告警信息發生在:make 檢測到遞歸的 make 調用時,可通信的子 make 進程出現并行處理的錯誤。遞歸執行的 make 的命令行參數中存在 -jN 參數( N 的值大于1),在有些情況下可能導致此錯誤,
例如:Makefile 中變量 MAKE 被賦值為 make –j2,并且遞歸調用的命令行中使用變量 MAKE。在這種情況下,被調用 make 進程不能和其它 make 進程進行通信,其只能簡單的獨立的并行處理兩個任務。
- jobserver unavailable
warning: jobserver unavailable: using -j1. Add '+' to parent make rule.
為了現實 make 進程之間的通信,上層 make 進程將傳遞信息給子 make 進程。在傳遞信息過程中可能存在這種情況,子 make 進程不是一個實際的 make 進程,而上層 make 卻不能確定子進程是否是真實的 make 進程。
它只是將所有信息傳遞下去。上層 make 采用正常的算法來決定這些。當出現這種情況,子進程只會接受父進程傳遞的部分有用的信息。子進程會產生該警告信息,之后按照其內建的順序方式進行處理。
總結
以上是生活随笔為你收集整理的浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国橡胶手套行业市场
- 下一篇: VS Code 离线安装插件方法