天天看點

makefile常見問題

1) Makefile:6: *** missing separator. Stop. 

   報出來Makefile的第6行有缺少分隔符問題. 打開Makefile檔案,找到第6行,發現是該行的指令

頂行寫,沒有用Tab鍵隔離.

   第六行行首加一個Tab鍵後問題解決.   注: 在makefile中,指令行要以tab鍵開頭。

   可通過.RECIPEPREFIX來修改tab為其他符号,如:

   .RECIPEPREFIX  = >

   all: 

   > echo $$pwd

2) = 和 :=的差別

   我們可以使用這兩個指派符号用其它變量來給變量指派。這兩個指派符号的效果不同。

   對=符号,為動态指派。右側變量不一定非要是已定義好的值,其也可以使用後面定義的值。如:

   foo = $(bar)

   bar = aaa

   all:

       echo $(foo)

   指令make all将列印出aaa。

   “:=”為靜态指派,不能用在目前代碼之前還未定義的變量。如:

   foo := $(bar)

   bar := aaa

   all:

       echo $(foo)

   指令make all列印内容為空。

3)make: *** cur-dir: command not found 問題

   以下代碼會導緻如題的出錯資訊。

   all:

   ifeq (0, ${MAKELEVEL})

        cur-dir := $(shell pwd)

   endif

   原因: all之後的必須是可執行指令,不能定義變量。變量的定義可以放在all的前面。如:

   ifeq (0, ${MAKELEVEL})

        cur-dir := $(shell pwd)

   endif

   all:

   ...

   也可以用define,如:

   ifeq (0, ${MAKELEVEL})

     define cur-dir

   $(shell pwd)

     endef

   endif

   all:

   ...  

   注意:endef前面用空格,不能用tab鍵,否則可能會報出找不到endef。 

4) make: source: Command not found (Error 127) 問題

   在makefile使用了source aaa.cshrc指令,然後報出上述問題。原因是make預設使用/bin/sh shell, 該shell不支援source指令。在makefile中修改shell:

   ifeq($(shell uname),Linux)

        SHELL  := /bin/csh

  endif

繼續閱讀