Linux之Makefile(併發執行命令)

2021-06-27 11:38:57 字數 1113 閱讀 7994

gnu make 支援同時執行多條命令。通常情況下,同一時刻只有乙個命令在執行,

下乙個命令只有在當前命令執行完成之後才能夠開始執行。不過可以通過 make的命令

行選項「-j」或者「--job」來告訴 make 在同一時刻可以允許多條命令同時被執行(注

意,在 ms-dos中此選項無效,因為它是單任務作業系統)。 

如果選項「-j」之後存在乙個整數,其含義是告訴 make 在同一時刻可允許同時執

行命令的數目。這個數字被稱為「job slots」。當「-j」選項之後沒有出現乙個數字時,

那麼同一時刻執行的命令數目沒有要求。使用預設的「job slots」 ,值為 1。表示make

將序列的執行規則的命令(同一時刻只能有一條命令被執行)。 

並行執行命令所帶來的問題是顯而易見地: 

1.  多個同時執的命令的輸出資訊將同時被輸出到終端。當出現錯誤時很難根據一

大堆凌亂的資訊來區分是哪條命令執行錯誤。 

2.  在同一時刻可能會存在多個命令執行程序同時讀取標準輸入,但是對於標準輸

入裝置來說,在同一時刻只能存在乙個程序訪問它。就是說在某個時間點, make

只能保證此刻正在執行的程序中的乙個程序讀取標準輸入流,而其它程序的標

準輸入流將置無效。因此在一時刻多個執行命令的程序中只能有乙個程序獲得

標準輸入,而其它需要讀取標準輸入流的程序由於輸入流無效而導致致命錯誤

(通常此程序會得到作業系統的管道破裂訊號而被終止)。 

這是因為:執行中的命令在什麼時候會讀取標準輸入流(終端輸入或重定向的

標準輸入)是不可**的。而得到標準輸入的順序總是按照先來先獲得的原則。

那個命令首先被執行,那麼它就可以首先得到標準輸入裝置。而其它後續需要

獲取標準輸入裝置的命令執行程序,由於不能得到標準輸入而產生致命錯誤。

在 makefile 規則中如果存在很多命令需要讀取標準輸入裝置,而它們又被允許

並行執行時,就會出現這樣的錯誤。 

為了解決這個問題。我們可以修改 makefile 規則的命令使之在執行過程中避免

使用標準輸入。當然也可以只存在乙個命令在執行時會訪問標準輸入流的

makefile。 

3.  會導致make的遞迴呼叫出現問題。

Linux之Makefile(變數高階用法)

我們可以替換變數中的共有的部分,其格式是 var a b 或是 其意思是,把變數 var 中所有以 a 字串 結尾 的 a 替換成 b 字串。這裡的 結尾 意思是 空格 或是 結束符 還是看乙個示例吧 foo a.o b.o c.o bar foo o c 這個示例中,我們先定義了乙個 foo 變數...

Linux之Makefile(自動化變數)

表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,就是匹配於目標中模式定義的集合。僅當目標是函式庫檔案中,表示規則中的目標成員名。例如,如果乙個目標是 foo.a bar.o 那麼,就是 bar.o 就是 foo.a 如果目標不是函式庫檔案 unix下是 a windows下是 lib 那...

makefile之萬用字元擴充套件

makefile中使用萬用字元的注意點 關於makefile中的萬用字元話題其實很簡單,在使用時心中知道以下幾點就ok。1 makefile中的萬用字元與通常的shell萬用字元是一樣的。萬用字元匹配?任何的單一字元 任何的字元字串 set 任何在set裡的字元 set 任何不在set裡的字元 2 ...