make 的常見錯誤資訊

來源:互聯網
上載者:User

make執行過程中所產生錯誤並不都是致命的;特別是在命令列之前存在“-”、或者make使用“-k”選項執行時。make執行過程的致命錯誤都帶有前置詞字元串“***”。錯誤資訊都有首碼,一種是執行程式名作為錯誤首碼(通常是“make”);另外一種是當makefile本身存在語法錯誤無法被make解析並執行時,首碼包含了makefile檔案名稱和出現錯誤的行號。


在下述的錯誤清單中,省略了普通首碼:


[FOO] Error NN

[FOO] signal description

這類錯誤並不是make的真正錯誤。它表示make檢測到make所調用的作為執行命令的程式返回一個非零狀態(Error NN),或者此命令程式以非正常方式退出(攜帶某種訊號),參考 5.4 命令的錯誤 一節。

如果錯誤資訊中沒有附加“***”字串,則是子過程的調用失敗,如果Makefile中此命令有首碼“-”,make會忽略這個錯誤。



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.
Stop.

missing rule before commands. Stop.

Makefile可能是以命令列開始:以[Tab]字元開始,但不是一個合法的命令列(例如,一個變數的賦值)。命令列必須和規則一一對應。

產生第二種的錯誤的原因可能是一行的第一個非Null 字元為分號,make會認為此處遺漏了規則的“target: prerequisite”部分。



No rule to make target `XXX'.

No rule to make target ` XXX ', needed by `yyy'.

無法為重建目標“XXX”找到合適的規則,包括明確規則和隱含規則。

修正這個錯誤的方法是:在Makefile中添加一個重建目標的規則。其它可能導致這些錯誤的原因是Makefile中檔案名稱拼字錯誤,或者破壞了源檔案樹(一個檔案不能被重建,可能是由於依賴檔案的問題)。



No targets specified and no makefile found. Stop.

No targets. Stop.

第一個錯誤表示在命令列中沒有指定需要重建的目標,並且make不能讀入任何makefile檔案。第二個錯誤表示能夠找到makefile檔案,但沒有終極目標或者沒有在命令列中指出需要重建的目標。這種情況下,make什麼也不做。參考 第九章 執行make



Makefile `XXX' was not found.

Included makefile `XXX' was not found.

沒有使用“-f”指定makefile檔案,make不能在目前的目錄下找到預設Makefile(makefile或者GNUmakefile)。使用“-f”指定檔案,但不能讀取這個指定的makefile檔案。



warning: overriding commands for target `XXX'

warning: ignoring old commands for target `XXX'

對同一目標“XXX”存在一個以上的重建命令。GNU make規定:當同一個檔案作為多個規則的目標時,只能有一個規則定義重建它的命令(雙冒號規則除外)。如果為一個目標多次指定了相同或者不同的命令,就會產生第一個警示;第二個警示資訊說新指定的命令覆蓋了上一次指定的命令。



Circular XXX <- YYY dependency dropped.

規則的依賴關係產生了迴圈:目標“XXX”的依賴檔案為“YYY”,而依賴“YYY”的依賴列表中又包含“XXX”。



Recursive variable `XXX' references itself (eventually). Stop.

make的變數“XXX”(遞迴展開式)在替換展開時,引用它自身。無論對於直接展開式變數(通過:=定義的)或追加定義(+=),這都是不允許的。



Unterminated variable reference. Stop.

變數或者函數引用文法不正確,沒有使用完整的的括弧(缺少左括弧或者右括弧)。



insufficient arguments to function `XXX'. Stop.

函數“XXX”引用時參數數目不正確。函數缺少參數。



missing target pattern. Stop.

multiple target patterns. Stop.
target pattern contains no `%'. Stop.               <<<====我編譯J_SIM時出現的錯誤!

mixed implicit and static pattern rules. Stop.

不正確的靜態模式規則。

第一條錯誤的原因是:靜態模式規則的目標段中沒有模式目標;

第二條錯誤的原因是:靜態模式規則的目標段中存在多個模式目標;

第三條錯誤的原因是:靜態模式規則的目標段目標模式中沒有包含模式字元“%”;

第四條錯誤的原因是:靜態模式規則的三部分都包含了模式字元“%”。正確的應該是只有後兩個才可以包含模式字元“%”。



warning: -jN forced in submake: disabling jobserver mode.

這一條警示和下條警示資訊發生在:make檢測到遞迴的make調用時,可通訊的子make進程出現平行處理的錯誤。遞迴執行的make的命令列參數中存在“-jN”參數(N的值大於1),在有些情況下可能導致此錯誤,例如:Makefile中變數“MAKE”被賦值為“make –j2”,並且遞迴調用的命令列中使用變數“MAKE”。在這種情況下,被調用make進程不能和其它make進程進行通訊,其只能簡單的獨立的平行處理兩個任務”。


warning: jobserver unavailable: using -j1. Add `+' to parent make rule.

為了現實make進程之間的通訊,上層make進程將傳遞資訊給子make進程。在傳遞資訊過程中可能存在這種情況,子make進程不是一個實際的make進程,而上層make卻不能確定子進程是否是真實的make進程。它只是將所有資訊傳遞下去。上層make採用正常的演算法來決定這些。當出現這種情況,子進程只會接受父進程傳遞的部分有用的資訊。子進程會產生該警告資訊,之後按照其內建的順序方式進行處理。




我寫了一個Makefile,是用來在Linux2.4下編譯一個模組的,其內容如下:

INCLUDEDIR = /usr/src/linux-2.4/include

DEBFLAGS = -O2

CC = gcc

CFLAGS = -D__KERNEL__ -DMODULE -Wall $(DEBFLAGS)

CFLAGS += -I$(INCLUDEDIR)
TARGET = ds1307

OBJS = $(TARGET).o

SRC = $(TARGET).c

$(CC) $(CFLAGS)

當我執行make的時候,所報錯誤為:

Makefile:9:*** commands commence before first target. Stop

請問高手,我的錯誤出在什麼地方.


沒定義目標,加一行,變成下面這個樣子:

dsl307:

$(CC) $(CFLAGS)


我寫了一個模組,名字叫zariphix_modules_001.c,內容如下:

#include<linux/kernel.h>

#include<linux/module.h>


int init_module(){

printk("Hello World!\n");

return 0;

}


void cleanup_module(){

printk("Bye-bye!\n");

}


然後寫了一個Makefile,內容如下:


CC=gcc

MODFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX

zariphix_modules_001.o: zariphix_modules_001.c /usr/include/linux/version.h

$(CC) $(MODFLAGS) -c zariphix_modules_001.c


我在make的時候提示以下錯誤:

Makefile:5: *** 遺漏分隔字元 。 停止。

分隔字元是什麼呢?還有我找不到我的核心源碼樹在系統的哪個位置,/usr/src下面沒有

我用的系統是 ubuntu 5.10


$(CC) $(MODFLAGS) -c zariphix_modules_001.c

這一行最前面要有一個 TAB,不能在第一列上,注意,是TAB, 不是空格,


運行 $ sudo make

又有了一大串錯誤提示:

引用:

gcc -Wall -DMODULE -D__KERNEL__ -DLINUX -c zariphix_modules_001.c

In file included from /usr/include/linux/sched.h:16,

from /usr/include/linux/module.h:9,

from zariphix_modules_001.c:2:

/usr/include/linux/signal.h:2:2: warning: #warning "You should include <signal.h>. This time I will do it for you."

In file included from /usr/include/linux/resource.h:4,

from /usr/include/linux/sched.h:79,

from /usr/include/linux/module.h:9,

from zariphix_modules_001.c:2:

/usr/include/linux/time.h:9: 錯誤:‘struct timespec’ 重定義

/usr/include/linux/time.h:15: 錯誤:‘struct timeval’ 重定義

/usr/include/linux/time.h:20: 錯誤:‘struct timezone’ 重定義

/usr/include/linux/time.h:47: 錯誤:‘struct itimerval’ 重定義

In file included from zariphix_modules_001.c:2:

/usr/include/linux/module.h:41: 錯誤:欄位 ‘attr’ 的類型不完全

/usr/include/linux/module.h:49: 錯誤:欄位 ‘kobj’ 的類型不完全

zariphix_modules_001.c: 在函數 ‘init_module’ 中:

zariphix_modules_001.c:5: 警告:隱式聲明函數 ‘printk’
make: ***
[zariphix_modules_001.o] 錯誤 1

這是怎麼回事呢?

解決這個問題了,原來是因為我的機器中沒有核心源碼樹。

我下了一個新的核心源碼包,編譯了一下,但沒有安裝。再次make就通過。

可新的問題又出現了,當我用insmod載入模組的時候提示:

insmod: error inserting 'zariphix_modules_001.ko': -1 Invalid module format

鬱悶。我試過了使用絕對路徑和相對路徑,也使用modprobe來載入,可都顯示錯誤,這又是怎麼回事呢?

也終於解決了~~~

安裝了編譯的核心~~就OK了



原文地址:http://blog.chinaunix.net/uid-22028566-id-1802957.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.