導航:首頁 > 文件教程 > gnumake教程

gnumake教程

發布時間:2022-12-22 20:10:21

① makefile教程

基於 Make 命令教程 - 阮一峰的網路日誌 (ruanyifeng.com) 總結,可以將make看作一個自頂向下的構建工具

在makefile相同目錄下執行 make 可查看效果

makefile文件名默認 Makefile 或 makefile .也可以指定文件: make -f rules.txt 或者 make --file=rules.txt

如果 前置條件 滿足,執行 命令 構建 目標

目標可以是文件,也可以是某個操作的名字

運行 make clean 可以執行這個操作:

如果make檢測到當前目錄中存在clean文件,就不會執行clean操作,因此最好標明clean是個操作

前置條件通常是一組文件名,用空格分割,指定了目標是否重新構建的標准:只要有一個前置文件不存在,或者有過更新(前置文件的修改時間晚於目標文件),目標就需要重新構建

如果當前目錄沒有source.txt,make會首到makefile的下面去尋找有沒有生成source.txt的目標

命令行首默認必須是一個tab鍵!!!,如果測試過程有報錯記得檢查下 ,如果想替換,可用.RECIPEPREFIX替換(對整個文件生效 (The .RECIPEPREFIX is only supported since 3.82

每條命令都在單獨的shell中執行,這些shell沒有關聯,也沒有繼承關系

解決辦法就是通過寫成一行

或者用反斜杠轉義

最後一個辦法是加上 .ONESHELL: 命令 (同上

# 表示注釋

正常情況下,make會列印每條命令,即使注釋也會列印,在命令前面加@可以關閉列印

通配符

用來指定一組符合條件的文件名,與bash類似 * ? [...]

允許對文件名進行模式匹配,匹配符是%

下面的命令將 file1.c 編譯為file1.o

允許使用 = 自定義變數

調用shell變數,需要兩個$$,因為make命令會使$轉義

變數支持引用

為了區分生效時間,分成四類 gnu make - What is the difference between the GNU Makefile variable assignments =, ?=, := and +=? - Stack Overflow

內置變數

$(CC)指向當前編譯器

$(MAKE)指向當前make工具

詳細如表 https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

自動變數

https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

判斷和循環 與bash相同

函數格式

內置函數

https://www.gnu.org/software/make/manual/html_node/Functions.html

② 純小白求教.Ubuntu如何安裝GNUMake3.8.2.附上下

您好,官方教程地址http //gnuradio org/redmine/projects/gnuradio/wiki/InstallingGR 希望你能點擊有用 祝你愉快,滿意請採納。

③ make 軟體怎樣製作

代碼變成可執行文件,叫做編譯(compile);先編譯這個,還是先編譯那個(即編譯的安排),叫做構建(build)。
Make是最常用的構建工具,誕生於1977年,主要用於C語言的項目。但是實際上 ,任何只要某個文件有變化,就要重新構建的項目,都可以用Make構建。
本文介紹Make命令的用法,從簡單的講起,不需要任何基礎,只要會使用命令行,就能看懂。我的參考資料主要是Isaac Schlueter的《Makefile文件教程》和《GNU Make手冊》。

④ 純小白求教.Ubuntu如何安裝GNUMake3.8.2,說明越

make3.8.2的安裝步驟:
tar -zxvf make3.8.2.tar.gz
在make-3.8.2目錄下
./configure
make
make install
一般情況下不會出現錯誤,在/usr/local/bin中可得到新版本的make,復制到/usr/bin中。

⑤ 純小白求教.Ubuntu如何安裝GNUMake3.8.2.附上下

1.安裝前GNU Radio正常運行,需要好多包,包括:開發工具,library,wx GUI,Qt GUI等(還有好多,不說了,對回安裝而言沒啥用)。這些東答西在終端里輸入以下命令就可以自動安裝:
sudo apt-get -y install git-core autoconf automake libtool g++ python-dev swig \
pkg-config libboost-all-dev libfftw3-dev libcppunit-dev libgsl0-dev \
libusb-dev sdcc libsdl1.2-dev python-wxgtk2.8 python-numpy \
python-cheetah python-lxml doxygen python-qt4 python-qwt5-qt4 libxi-dev \
libqt4-opengl-dev libqwt5-qt4-dev libfontconfig1-dev libxrender-dev
2.安裝GNU Radio

⑥ Makefile入門(八):make運行

一般來說,最簡單的就是直接在命令行下輸入make命令,make命令會找當前目錄的makefile來執行,一切都是自動的。但也有時你也許只想讓make重編譯某些文件,而不是整個工程,而又有的時候你有幾套編譯規則,你想在不同的時候使用不同的編譯規則,等等。本章節就是講述如何使用 make命令的。

make命令執行後有三個退出碼:

0 —— 表示成功執行。

1 —— 如果make運行時出現任何錯誤,其返回1。

2 —— 如果你使用了make的「-q」選項,並且make使得一些目標不需要更新,那麼返回2。

Make的相關參數我們會在後續章節中講述。

前面我們說過,GNU make找尋默認的Makefile的規則是在當前目錄下依次找三個文件——「GNUmakefile」、「makefile」和「Makefile」。其按順序找這三個文件,一旦找到,就開始讀取這個文件並執行。

當然,我們也可以給make命令指定一個特殊名字的Makefile。要達到這個功能,我們要使用make的「-f」或是「--file」參數(「--makefile」參數也行)。例如,我們有個makefile的名字是「hchen.mk」,那麼,我們可以這樣來讓make來執行這個文件:

make –f hchen.mk

如果在make的命令行是,你不只一次地使用了「-f」參數,那麼,所有指定的makefile將會被連在一起傳遞給make執行。

一般來說,make的最終目標是makefile中的第一個目標,而其它目標一般是由這個目標連帶出來的。這是make的默認行為。當然,一般來說,你的makefile中的第一個目標是由許多個目標組成,你可以指示make,讓其完成你所指定的目標。要達到這一目的很簡單,需在make命令後直接跟目標的名字就可以完成(如前面提到的「make clean」形式)

任何在makefile中的目標都可以被指定成終極目標,但是除了以「-」打頭,或是包含了「=」的目標,因為有這些字元的目標,會被解析成命令行參數或是變數。甚至沒有被我們明確寫出來的目標也可以成為make的終極目標,也就是說,只要make可以找到其隱含規則推導規則,那麼這個隱含目標同樣可以被指定成終極目標。

有一個make的環境變數叫「MAKECMDGOALS」,這個變數中會存放你所指定的終極目標的列表,如果在命令行上,你沒有指定目標,那麼,這個變數是空值。這個變數可以讓你使用在一些比較特殊的情形下。比如下面的例子:

基於上面的這個例子,只要我們輸入的命令不是「make clean」,那麼makefile會自動包含「foo.d」和「bar.d」這兩個makefile。

使用指定終極目標的方法可以很方便地讓我們編譯我們的程序,例如下面這個例子:

從這個例子中,我們可以看到,這個makefile中有四個需要編譯的程序——「prog1」, 「prog2」, 「prog3」和 「prog4」,我們可以使用「make all」命令來編譯所有的目標(如果把all置成第一個目標,那麼只需執行「make」),我們也可以使用 「make prog2」來單獨編譯目標「prog2」。

即然make可以指定所有makefile中的目標,那麼也包括「偽目標」,於是我們可以根據這種性質來讓我們的makefile根據指定的不同的目標來完成不同的事。在Unix世界中,軟體發布時,特別是GNU這種開源軟體的發布時,其makefile都包含了編譯、安裝、打包等功能。我們可以參照這種規則來書寫我們的makefile中的目標。

<dl style="font-size: 12.6667px; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);">

<dt>「all」</dt>

<dd>這個偽目標是所有目標的目標,其功能一般是編譯所有的目標。</dd>

<dt>clean」</dt>

<dd>這個偽目標功能是刪除所有被make創建的文件。</dd>

<dt>「install」</dt>

<dd>這個偽目標功能是安裝已編譯好的程序,其實就是把目標執行文件拷貝到指定的目標中去。</dd>

<dt>print」</dt>

<dd>這個偽目標的功能是例出改變過的源文件。</dd>

<dt>「tar」</dt>

<dd>這個偽目標功能是把源程序打包備份。也就是一個tar文件。</dd>

<dt>「dist」</dt>

<dd>這個偽目標功能是創建一個壓縮文件,一般是把tar文件壓成Z文件。或是gz文件。</dd>

<dt>TAGS」</dt>

<dd>這個偽目標功能是更新所有的目標,以備完整地重編譯使用。</dd>

<dt>「check」和「test」</dt>

<dd>這兩個偽目標一般用來測試makefile的流程。</dd>

</dl>

當然一個項目的makefile中也不一定要書寫這樣的目標,這些東西都是GNU的東西,但是我想,GNU搞出這些東西一定有其可取之處(等你的 UNIX下的程序文件一多時你就會發現這些功能很有用了),這里只不過是說明了,如果你要書寫這種功能,最好使用這種名字命名你的目標,這樣規范一些,規范的好處就是——不用解釋,大家都明白。而且如果你的makefile中有這些功能,一是很實用,二是可以顯得你的makefile很專業(不是那種初學者的作品)。

有時候,我們不想讓我們的makefile中的規則執行起來,我們只想檢查一下我們的命令,或是執行的序列。於是我們可以使用make命令的下述參數:

「-n」 「--just-print」 「--dry-run」 「--recon」 不執行參數,這些參數只是列印命令,不管目標是否更新,把規則和連帶規則下的命令列印出來,但不執行,這些參數對於我們調試makefile很有用處。

「-t」 「--touch」 這個參數的意思就是把目標文件的時間更新,但不更改目標文件。也就是說,make假裝編譯目標,但不是真正的編譯目標,只是把目標變成已編譯過的狀態。

「-q」 「--question」 這個參數的行為是找目標的意思,也就是說,如果目標存在,那麼其什麼也不會輸出,當然也不會執行編譯,如果目標不存在,其會列印出一條出錯信息。

「-W <file>;」 「--what-if=<file>;」 「--assume-new=<file>;」 「--new-file=<file>;」 這個參數需要指定一個文件。一般是是源文件(或依賴文件),Make會根據規則推導來運行依賴於這個文件的命令,一般來說,可以和「-n」參數一同使用,來查看這個依賴文件所發生的規則命令。

另外一個很有意思的用法是結合「-p」和「-v」來輸出makefile被執行時的信息(這個將在後面講述)。

下面列舉了所有GNU make 3.80版的參數定義。其它版本和產商的make大同小異,不過其它產商的make的具體參數還是請參考各自的產品文檔。

「-b」 「-m」 這兩個參數的作用是忽略和其它版本make的兼容性。

「-B」 「--always-make」 認為所有的目標都需要更新(重編譯)。

「-C <dir>」 「--directory=<dir>」 指定讀取makefile的目錄。如果有多個「-C」參數,make的解釋是後面的路徑以前面的作為相對路徑,並以最後的目錄作為被指定目錄。如:「make –C ~hchen/test –C prog」等價於「make –C ~hchen/test/prog」。

「—debug[=<options>]」 輸出make的調試信息。它有幾種不同的級別可供選擇,如果沒有參數,那就是輸出最簡單的調試信息。下面是<options>的取值:

a —— 也就是all,輸出所有的調試信息。(會非常的多)

b —— 也就是basic,只輸出簡單的調試信息。即輸出不需要重編譯的目標。

v —— 也就是verbose,在b選項的級別之上。輸出的信息包括哪個makefile被解析,不需要被重編譯的依賴文件(或是依賴目標)等。

i —— 也就是implicit,輸出所有的隱含規則。

j —— 也就是jobs,輸出執行規則中命令的詳細信息,如命令的PID、返回碼等。

m —— 也就是makefile,輸出make讀取makefile,更新makefile,執行makefile的信息。

「-d」 相當於「--debug=a」。

「-e」 「--environment-overrides」 指明環境變數的值覆蓋makefile中定義的變數的值。

「-f=<file>」 「--file=<file>」 「--makefile=<file>」 指定需要執行的makefile。

「-h」 「--help」 顯示幫助信息。

「-i」 「--ignore-errors」 在執行時忽略所有的錯誤。

「-I <dir>」 「--include-dir=<dir>」 指定一個被包含makefile的搜索目標。可以使用多個「-I」參數來指定多個目錄。

「-j [<jobsnum>]」 「--jobs[=<jobsnum>]」 指同時運行命令的個數。如果沒有這個參數,make運行命令時能運行多少就運行多少。如果有一個以上的「-j」參數,那麼僅最後一個「-j」才是有效的。(注意這個參數在MS-DOS中是無用的)

「-k」 「--keep-going」 出錯也不停止運行。如果生成一個目標失敗了,那麼依賴於其上的目標就不會被執行了。

「-l <load>」 「--load-average[=<load]」 「—max-load[=<load>]」 指定make運行命令的負載。

「-n」 「--just-print」 「--dry-run」 「--recon」 僅輸出執行過程中的命令序列,但並不執行。

「-o <file>」 「--old-file=<file>」 「--assume-old=<file>」 不重新生成的指定的<file>,即使這個目標的依賴文件新於它。

「-p」 「--print-data-base」 輸出makefile中的所有數據,包括所有的規則和變數。這個參數會讓一個簡單的makefile都會輸出一堆信息。如果你只是想輸出信息而不想執行makefile,你可以使用「make -qp」命令。如果你想查看執行makefile前的預設變數和規則,你可以使用 「make –p –f /dev/null」。這個參數輸出的信息會包含著你的makefile文件的文件名和行號,所以,用這個參數來調試你的 makefile會是很有用的,特別是當你的環境變數很復雜的時候。

「-q」 「--question」 不運行命令,也不輸出。僅僅是檢查所指定的目標是否需要更新。如果是0則說明要更新,如果是2則說明有錯誤發生。

「-r」 「--no-builtin-rules」 禁止make使用任何隱含規則。

「-R」 「--no-builtin-variabes」 禁止make使用任何作用於變數上的隱含規則。

「-s」 「--silent」 「--quiet」 在命令運行時不輸出命令的輸出。

「-S」 「--no-keep-going」 「--stop」 取消「-k」選項的作用。因為有些時候,make的選項是從環境變數「MAKEFLAGS」中繼承下來的。所以你可以在命令行中使用這個參數來讓環境變數中的「-k」選項失效。

「-t」 「--touch」 相當於UNIX的touch命令,只是把目標的修改日期變成最新的,也就是阻止生成目標的命令運行。

「-v」 「--version」 輸出make程序的版本、版權等關於make的信息。

「-w」 「--print-directory」 輸出運行makefile之前和之後的信息。這個參數對於跟蹤嵌套式調用make時很有用。

「--no-print-directory」 禁止「-w」選項。

「-W <file>」 「--what-if=<file>」 「--new-file=<file>」 「--assume-file=<file>」 假定目標<file>;需要更新,如果和「-n」選項使用,那麼這個參數會輸出該目標更新時的運行動作。如果沒有「-n」那麼就像運行UNIX的「touch」命令一樣,使得<file>;的修改時間為當前時間。

「--warn-undefined-variables」 只要make發現有未定義的變數,那麼就輸出警告信息。

⑦ 經常看到很多人翻譯了GNU Make 使用手冊,但不知道這個手冊原版的英文版在哪裡有啊,是linux源碼里忙

簡答:
在線的單個html的版本的GNU Make的網址:
https://www.gnu.org/software/make/manual/make.html

詳解:
在GNU的官網網站中的Make的主頁:

Make - GNU Project - Free Software Foundation
https://www.gnu.org/software/make/
中可以找到Make的英文版手冊:

https://www.gnu.org/software/make/manual/
而且還有多種格式:
在線的單個html的,在線的多個html的,壓縮好的(可供下載的)單個html的,壓縮好的(可供下載的)多個html的,pdf的,等等。就不貼每個的地址了,自己去看即可。

⑧ GNU_Make中文手冊

在make執行第一階段中如果變數和函數被展開,那麼稱此展開為立即展開,在第二階段的展開稱為延後展開。區別如下:
立即展開就是變數定義時,就確定變數的值,比如a=1,b=a+1,如果是立即展開,那麼b就確定為2了,而延後展開不同,同樣a=1,b=a+1,需要等到使用變數b的時候才展開,但是如果在b=a+1之後,且在使用變數b之前,a的值變為2了,那麼使用b的時候就變為b=2+1=3了。那麼哪些情形是立即展開,哪些是延後展開呢?定義變數的三種方法,如果變數 a 通過 a+= 的方式賦值,且之前 a 是一個簡單變數,即通過 a:= 的方式定義,那麼 a 立即展開 的,其餘情況都是 延後展開

foo.o 是這個規則的目標, def.h foo.c 是目標的依賴,第二行是規則的命令。上述規則告訴我們如何重建目標文件,以及何時重建。

其餘情況不能直接使用,需要配合wildcard函數來使用。

本意是foo依賴目錄下所有的.o文件,如果所有的.o文件都存在,那麼 能正確編譯出foo,但是如果刪掉所有.o後,就會報錯,說沒有重建*.o的規則,這里是因為使用通配符的時候出了錯。應該改為

僅列出常用的,其餘的暫時不需要。

當重建一個目標時,所依賴的文件名為 -INAME ,make將執行以下搜索:

一般情況下,我們的庫文件是不會在make的時候重建的,所以只要能在上述4個步驟中的某一個找到它就行。下面是一個具體的栗子。

在目錄 dynamic_lib 中有一個簡單的動態庫,在 static_lib 中有一個簡單的靜態庫,靜態庫和動態庫的生成見 你的動態庫還在報錯? 。文件 main.c 引用了兩個庫中的函數,我們的Makefile應該怎麼寫呢?

有一下幾點需要格外注意:

我們寫一個運行腳本,把環境變數 LD_LIBRARY_PATH 設置好,進行驗證。

執行結果如下:

使用場景有兩個,這里只介紹一個,那就是如果我們的規則是執行一段命令,而不是重建某個文件,如clean。

FORCE僅僅是一個符號,也可以用其他任意未用過的符號替代,FORCE出現在依賴列表中,如果FORCE是一個真正存在的文件名,那麼將根據文件的新舊來決定是否重建target,但是FORCE是一個不存在的文件,且FORCE本身的依賴是空,規則命令也是空,在這種情下,依賴與FORCE的目標將無條件被重建,看例子。

下面是一個具體的栗子:下面這個例子中,終極目標 gen_file ,這個目標依賴文件 test.log ,即如果文件 test.log 不存在或比 gen_file文件 新,將會執行 echo "gen_file" ,所以在第一次執行 make 時,由於 test.log 文件不存在,會執行一次,並生成文件 test.log ,此後再執行將不會有任何輸出,因為文件 test.log 並沒有變得更新,所以make覺得不需要執行。

要想每次都執行日期更新,那麼需要文件 test.log 依賴於一個永遠是最新的東西,那麼就是FORCE,如下所示,由於FORCE並不存在,所以每次都需要更新 test.log 也就會執行 echo和rm 命令了。

在makefile1中使用include包含另一個makefile2相當於把makefile2中的內容貼到include處合並為一個makefile文件。然後該怎麼執行就怎麼執行。

如果執行 make -f makefile1 ,那麼先包含文件 makefile2 ,那麼 __all 成為第一目標,也就是終極目標,所以默認重建 __all ,所以輸出 target __all

靜態模式定義了一種比較簡約的目標依賴的書寫方法,有三種不同的寫法,意義等價。完全不用糾結其中的意義。

⑨ 純小白求教.Ubuntu如何安裝GNUMake3.8.2,說明越

Ubuntu的軟體包格式是deb,如果要安裝rpm的包,則要先用alien把rpm轉換成deb。sudoapt-getinstallalien#alien默認沒有安裝,所以首先要安裝它sudoalienxxxx.rpm#將rpm轉換位deb,完成後會生成一個同名的xxxx.debsudodpkg-ixxxx.deb#安裝注意,用alien轉換的deb包並不能保證100%順利安裝,所以可以找到deb最好直接用deb有時候,我們想要使用的軟體並沒有被包含到Ubuntu的倉庫中,而程序本身也沒有提供讓Ubuntu可以使用的deb包,你又不願從源代碼編譯。但假如軟體提供有rpm包的話,我們也是可以在Ubuntu中安裝的。方法一:1.先安裝alien和fakeroot這兩個工具,其中前者可以將rpm包轉換為deb包。安裝命令為:sudoapt-getinstallalienfakeroot2.將需要安裝的rpm包下載備用,假設為package.rpm。3.使用alien將rpm包轉換為deb包:fakerootalienpackage.rpm4.一旦轉換成功,我們可以即刻使用以下指令來安裝:sudodpkg-ipackage.deb

⑩ 純小白求教.Ubuntu如何安裝GNUMake3.8.2,說明越

make3.8.2的安裝步驟:tar-zxvfmake3.8.2.tar.gz在make-3.8.2目錄下./configuremakemakeinstall一般情況下不會出現錯誤,在/usr/local/bin中可得到新版本的make,復制到/usr/bin中。

閱讀全文

與gnumake教程相關的資料

熱點內容
win10的文件查找在哪裡設置密碼 瀏覽:617
蘋果6plusitunesstore 瀏覽:971
qqiphone6在線手機軟體 瀏覽:407
文件怎麼轉發 瀏覽:94
數控機床編程與操作怎麼啟動 瀏覽:636
linux查找c文件是否存在 瀏覽:150
從事程序員的身體要求 瀏覽:259
txt文件轉成json文件 瀏覽:941
iosapp怎麼讓未讀消息顯示 瀏覽:805
百度智能雲上傳文件軟體 瀏覽:756
怎麼把電腦盤設密碼 瀏覽:768
蘋果直徑怎麼量 瀏覽:542
alienware13升級 瀏覽:14
循環載入js 瀏覽:759
qq電話記錄在哪個文件夾 瀏覽:325
jsf如何返回json數據 瀏覽:136
javascript百度地圖 瀏覽:380
蘋果4怎麼弄3g網路 瀏覽:775
如何刪除公司文件 瀏覽:659
u盤歌曲怎麼從文件夾剪切出來 瀏覽:766

友情鏈接