make的常见错误信息
本文對(duì)make執(zhí)行時(shí)可能出現(xiàn)常見(jiàn)錯(cuò)誤進(jìn)行匯總、分析,并給出修正的可能方法。
make執(zhí)行過(guò)程中所產(chǎn)生錯(cuò)誤并不都是致命的;特別是在命令行之前存在“-”、或者make使用“-k”選項(xiàng)執(zhí)行時(shí)。make執(zhí)行過(guò)程的致命錯(cuò)誤都帶有前綴字符串“***”。
錯(cuò)誤信息都有前綴,一種是執(zhí)行程序名作為錯(cuò)誤前綴(通常是“make”);另外一種是當(dāng)Makefile本身存在語(yǔ)法錯(cuò)誤無(wú)法被make解析并執(zhí)行時(shí),前綴包含了makefile文件名和出現(xiàn)錯(cuò)誤的行號(hào)。
在下述的錯(cuò)誤列表中,省略了普通前綴:
[FOO] Error NN
[FOO] signal description
這類錯(cuò)誤并不是make的真正錯(cuò)誤。它表示make檢測(cè)到make所調(diào)用的作為執(zhí)行命令的程序返回一個(gè)非零狀態(tài)(Error NN),或者此命令程序以非正常方式退出(攜帶某種信號(hào))。
如果錯(cuò)誤信息中沒(méi)有附加“***”字符串,則是子過(guò)程的調(diào)用失敗,如果Makefile中此命令有前綴“-”,make會(huì)忽略這個(gè)錯(cuò)誤。
missing separator. Stop.
missing separator (did you mean TAB instead of 8 spaces?). Stop.
不可識(shí)別的命令行,make在讀取Makefile過(guò)程中不能解析其中包含的內(nèi)容。GNU make在讀取Makefile時(shí)根據(jù)各種分隔符(:, =, [TAB]字符等)來(lái)識(shí)別Makefile的每一行內(nèi)容。這些錯(cuò)誤意味著make不能發(fā)現(xiàn)一個(gè)合法的分隔符。
出現(xiàn)這些錯(cuò)誤信息的可能的原因是(或許是編輯器,絕大部分是ms-windows的編輯器)在Makefile中的命令之前使用了4個(gè)(或者8個(gè))空格代替了[Tab]字符。這種情況,將產(chǎn)生上述的第二種形式產(chǎn)生錯(cuò)誤信息。且記,所有的命令行都應(yīng)該是以[Tab]字符開(kāi)始的。
commands commence before first target. Stop.
missing rule before commands. Stop.
Makefile可能是以命令行開(kāi)始:以[Tab]字符開(kāi)始,但不是一個(gè)合法的命令行(例如,一個(gè)變量的賦值)。命令行必須和規(guī)則一一對(duì)應(yīng)。
產(chǎn)生第二種的錯(cuò)誤的原因可能是一行的第一個(gè)非空字符為分號(hào),make會(huì)認(rèn)為此處遺漏了規(guī)則的“target: prerequisite”部分。
No rule to make target `XXX'.
No rule to make target ` XXX ', needed by `yyy'.
無(wú)法為重建目標(biāo)“XXX”找到合適的規(guī)則,包括明確規(guī)則和隱含規(guī)則。
修正這個(gè)錯(cuò)誤的方法是:在Makefile中添加一個(gè)重建目標(biāo)的規(guī)則。其它可能導(dǎo)致這些錯(cuò)誤的原因是Makefile中文件名拼寫錯(cuò)誤,或者破壞了源文件樹(一個(gè)文件不能被重建,可能是由于依賴文件的問(wèn)題)。
No targets specified and no makefile found. Stop.
No targets. Stop.
第一個(gè)錯(cuò)誤表示在命令行中沒(méi)有指定需要重建的目標(biāo),并且make不能讀入任何makefile文件。第二個(gè)錯(cuò)誤表示能夠找到makefile文件,但沒(méi)有終極目標(biāo)或者沒(méi)有在命令行中指出需要重建的目標(biāo)。這種情況下,make什么也不做。
Makefile `XXX' was not found.
Included makefile `XXX' was not found.
沒(méi)有使用“-f”指定makefile文件,make不能在當(dāng)前目錄下找到默認(rèn)Makefile(makefile或者GNUmakefile)。使用“-f”指定文件,但不能讀取這個(gè)指定的makefile文件。
warning: overriding commands for target `XXX'
warning: ignoring old commands for target `XXX'
對(duì)同一目標(biāo)“XXX”存在一個(gè)以上的重建命令。GNU make規(guī)定:當(dāng)同一個(gè)文件作為多個(gè)規(guī)則的目標(biāo)時(shí),只能有一個(gè)規(guī)則定義重建它的命令(雙冒號(hào)規(guī)則除外)。如果為一個(gè)目標(biāo)多次指定了相同或者不同的命令,就會(huì)產(chǎn)生第一個(gè)告警;第二個(gè)告警信息說(shuō)新指定的命令覆蓋了上一次指定的命令。
Circular XXX <- YYY dependency dropped.
規(guī)則的依賴關(guān)系產(chǎn)生了循環(huán):目標(biāo)“XXX”的依賴文件為“YYY”,而依賴“YYY”的依賴列表中又包含“XXX”。
Recursive variable `XXX' references itself (eventually). Stop.
make的變量“XXX”(遞歸展開(kāi)式)在替換展開(kāi)時(shí),引用它自身。無(wú)論對(duì)于直接展開(kāi)式變量(通過(guò):=定義的)或追加定義(+=),這都是不允許的。
Unterminated variable reference. Stop.
變量或者函數(shù)引用語(yǔ)法不正確,沒(méi)有使用完整的的括號(hào)(缺少左括號(hào)或者右括號(hào))。
insufficient arguments to function `XXX'. Stop.
函數(shù)“XXX”引用時(shí)參數(shù)數(shù)目不正確。函數(shù)缺少參數(shù)。
missing target pattern. Stop.
multiple target patterns. Stop.
target pattern contains no `%'. Stop.
mixed implicit and static pattern rules.? Stop.
不正確的靜態(tài)模式規(guī)則。
第一條錯(cuò)誤的原因是:靜態(tài)模式規(guī)則的目標(biāo)段中沒(méi)有模式目標(biāo);
第二條錯(cuò)誤的原因是:靜態(tài)模式規(guī)則的目標(biāo)段中存在多個(gè)模式目標(biāo);
第三條錯(cuò)誤的原因是:靜態(tài)模式規(guī)則的目標(biāo)段目標(biāo)模式中沒(méi)有包含模式字符“%”;
第四條錯(cuò)誤的原因是:靜態(tài)模式規(guī)則的三部分都包含了模式字符“%”。正確的應(yīng)該是只有后兩個(gè)才可以包含模式字符“%”。
warning: -jN forced in submake: disabling jobserver mode.
這一條告警和下條告警信息發(fā)生在:make檢測(cè)到遞歸的make調(diào)用時(shí),可通信的子make進(jìn)程出現(xiàn)并行處理的錯(cuò)誤。遞歸執(zhí)行的make的命令行參數(shù)中存在“-jN”參數(shù)(N的值大于1),在有些情況下可能導(dǎo)致此錯(cuò)誤,例如:Makefile中變量“MAKE”被賦值為“make –j2”,并且遞歸調(diào)用的命令行中使用變量“MAKE”。在這種情況下,被調(diào)用make進(jìn)程不能和其它make進(jìn)程進(jìn)行通信,其只能簡(jiǎn)單的獨(dú)立的并行處理兩個(gè)任務(wù)”。
warning: jobserver unavailable: using -j1. Add `+' to parent make rule.
為了現(xiàn)實(shí)make進(jìn)程之間的通信,上層make進(jìn)程將傳遞信息給子make進(jìn)程。在傳遞信息過(guò)程中可能存在這種情況,子make進(jìn)程不是一個(gè)實(shí)際的make進(jìn)程,而上層make卻不能確定子進(jìn)程是否是真實(shí)的make進(jìn)程。它只是將所有信息傳遞下去。上層make采用正常的算法來(lái)決定這些。當(dāng)出現(xiàn)這種情況,子進(jìn)程只會(huì)接受父進(jìn)程傳遞的部分有用的信息。子進(jìn)程會(huì)產(chǎn)生該警告信息,之后按照其內(nèi)建的順序方式進(jìn)行處理。
轉(zhuǎn)載于:https://www.cnblogs.com/elect-fans/archive/2011/12/06/2408735.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的make的常见错误信息的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: silverlight 实时更新 mar
- 下一篇: TWaver html5 + NodeJ