makefile編譯運行
㈠ makefile怎麼用
操作步驟如下:
1、打開DOS窗口,輸入nmake,可能會出現如下錯誤提示,如下圖所示。
5、以開始我們的編譯了,打開DOS窗口,導航到源代碼目錄,執行nmake,注意nmake對應的編譯為makefile。
㈡ 如何使用Makefile自動編譯iPhone程序
makefile裡面所寫的內容其實就是你要編譯的命令,那麼,什麼是編譯命令呢?
假寫你已經寫好一個程序代碼,並將之存在一個.c文件中,如:hello.c,在終端上你可以這樣做!在終端上輸入gcc -o hello hello.c
然後回車,看一看有沒有什麼反映,如果沒有打出很多英文的話,恭喜你!你完美地完成了第一步!然後,在終端中輸入./hello 看看是不是有什麼輸出了?
現在來解釋一下編譯命令:上面的命令的意思就是,使用gcc編譯器編譯hello.c源代碼,生成的文件名稱叫做hello.最後,要看程序運行結果,就要運行生成的程序也就是「./hello」了,「./」的意思就是在當前的目錄下運行。
而makefile中內容的就是上面的編譯命令,如:在makefile文件中寫入
Hello:hello.c
gcc -o Hello hello.c
保存文件之後直接在終端中輸入make,就完成編譯了!makefile存在的意義只是讓編譯更加方便,也就說,可以把所以的編譯都寫在一個makefile文件中,然後在終端中輸入make就可以完成makefile文件里的命令!
建議還是先將c語言入門,然後再學使用makefile編譯程序吧!因為剛開始的時候不用編譯很多文件,如果一個文件要編寫一個makefile文件的話,那豈不是很繁?
㈢ 如何使用自己的makefile編譯android ndk項目
android ndk提供了一套自己的makefile管理方式,要將源碼項目移植到android平台,需要按照android的makefile規則編寫makefile,還要按android的規則部署源碼目錄,對一個有自己的makefile管理方法的大型項目來說,只是做一下makefile遷移工作就是一件很麻煩的事。
其實android ndk上的編譯說到底也就是交叉編譯,只要配置好交叉編譯工具鏈,使用原有的makefile也是可以編譯出在android運行的c、c++程序的。
以android-ndk-r4-crystax的ndk版本為例:
編譯器路徑 android-ndk-r4-crystax/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin
名稱前綴 arm-eabi-
頭文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/include
庫文件目錄 android-ndk-r4-crystax/build/platforms/android-3/arch-arm/usr/lib
你可以試一下上面的配置,如果編譯鏈接都沒有問題,可以adb push到android設備上運行看看,什麼結果?
有點崩潰,根本運行不起來,你也許想試試看android自帶的ndk例子,確實是能夠運行的,問題在哪兒呢?
只是正確配置了編譯器、頭文件、庫文件還不夠,還需要配置編譯、鏈接的參數,android例子中編譯鏈接的參數是什麼呢?你也許想深究一下android的makefile,可是不久你會發現那是更崩潰的事情,裡面用了很多的make腳本函數。其實android的makefile是可以把執行的詳細命令輸出來的,只要make的時候加上V=1即可。可以看到確實帶了很多參數
編譯參數:
-fpic
-mthumb-interwork
-ffunction-sections
-funwind-tables
-fstack-protector
-fno-short-enums
-Wno-psabi
-march=armv5te
-mtune=xscale
-msoft-float
-mthumb
-fomit-frame-pointer
-fno-strict-aliasing
-finline-limit=64
-Wa,--noexecstack
-D__ARM_ARCH_5__
-D__ARM_ARCH_5T__
-D__ARM_ARCH_5E__
-D__ARM_ARCH_5TE__
-DANDROID
鏈接參數:
-nostdlib
-Bdynamic
-Wl,-dynamic-linker,/system/bin/linker
-Wl,--gc-sections
-Wl,-z,noreloc
-Wl,--no-undefined
-Wl,-z,noexecstack
-L$(PLATFORM_LIBRARY_DIRECTORYS)
crtbegin_static.o
crtend_android.o
這其中鏈接參數中的-Wl,-dynamic-linker,/system/bin/linker、crtbegin_static.o、crtend_android.o是最關鍵的,android使用了自己的進程載入器,並且自定義了c運行時的啟動結束。難怪先前編譯的進程啟動不了。
㈣ Makefile詳解
make 命令執行時,需要根據一些規則來決定按照怎麼樣的方式去 編譯和鏈接程序 ,這些規則就由 makefile 文件所指定。如果我們 makefile 文件寫的足夠好,make 命令會自動地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。
首先,本文將給出一個makefile文件的示例,以便大家能有一個直觀感受,這個例子來源於 GNU的make使用手冊 。在這個例子中,我們的工程有8個c文件,和3個頭文件,我們要寫一個makefile來告訴make命令如何編譯和鏈接這幾個文件。例子如下:
這個例子里 make 的編碼規則如下:
a. 如果這個工程沒有編譯過,那麼我們的所有c文件都要編譯並被鏈接。
b. 如果這個工程的某幾個c文件被修改,那麼我們只編譯被修改的c文件,並鏈接目標程序。
c. 如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的c文件,並鏈接目標程序。
在詳細拆解上一節的 Makefile 之前,先來看下 Makefile 的基本範式。
target可以是一個 1) object file(可執行文件) ,2) 可執行文件 ,還可以是個3) label(標簽) ,關於標簽這個特性,在後面的 偽目標 章節還會有敘述。
prerequisites 就是,要生成那個target所需要的文件或是目標。 command 也就是 make 需要執行的命令,可以是任意的
shell 命令。
這是一個文件的依賴關系,也就是說,target 這一個或多個的目標文件依賴於 prerequisites 中的文件,其生成規則定義在 command 中。同時, prerequisites 中如果有一個以上的文件比target文件要新的話, command 所定義的命令就會被執行。這就是 Makefile 的規則,也是 Makefile 中 最核心 的內容。
有了這些規則後,再來分析上面的例子。在這個 makefile 中,目標文件(target)包含:
依賴文件(prerequisites)就是冒號後面的那些 .c 文件和 .h 文件。每一個 .o 文件都有一組依賴文件,而這些 .o 文件又是執行文件 edit 的依賴文件。
在定義好依賴關系後,後續的那一行定義了如何生成目標文件的系統命令, 一定要以一個tab鍵作為開頭 。 make 會比較
targets 文件和 prerequisites 文件的修改日期,如果 prerequisites 文件的日期要比targets文件的日期要新,或者 target 不存在的話,那麼,make就會執行後續定義的命令。
我們可以把這個內容保存在名字為 makefile 或 Makefile 的文件中,然後在該目錄下直接輸入命令 make 就可以生成可執行文件edit。如果要刪除執行文件和所有的中間目標文件,那麼,只要簡單地執行一下 make clean 就可以了。 註:反斜線()是換行符的意思,這樣比較便於閱讀。
這里要說明一點的是, clean 不是一個文件,它只不過是一個動作名字,有點像C語言中的 lable 一樣,其冒號後什麼也沒有,那麼,make就不會去找它的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令(不僅用於 clean,其他 lable 同樣適用),就要在 make 命令後顯式指出這個 lable 的名字。這樣的方法非常有用, 我們可以在一個 makefile 中定義不用的編譯或是和編譯無關的命令,比如程序的打包,程序的備份 ,等等。
在默認的方式下,也就是我們只輸入make命令。那麼,
這就是整個 make 的依賴性,make 會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最後被依賴的文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,這些都不在 make 職責范圍內。
通過上述分析,我們知道,像 clean 這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,我們可以顯示要 make 執行。即命令 make clean ,以此來清除所有的目標文件,以便重編譯。
在上面的例子中可以看到,後綴為 .o 的一大串文件名寫了兩次,這樣比較費時費力,而且如果文件有所增減,要修改的地方也非常多,對以後的維護造成困難。在這種情形下,我們可以在Makefile里使用變數代替這一大串依賴文件,這里變數的使用方式基本類似於shell腳本里變數的使用方法。
我們可以在makefile一開始就這樣定義:
那麼接下來我們就可以很方便地在我們的Makefile中以 $(objects) 的方式來使用這個變數了,於是如果有新的 .o 文件加入,我們只需簡單地修改一下 objects 變數就可以了。
GNU 的 make 很強大,它可以自動推導文件以及文件依賴關系後面的命令,於是我們就沒必要去在每一個 .o 文件後都寫上類似的命令。因為,我們的make會自動識別,並自己推導命令。
只要make看到一個 .o 文件,它就會自動的把 .c 文件加在依賴關系中,如果make找到一個 FILENAME.o ,那麼 FILENAME.c ,就會是 FILENAME.o 的依賴文件。並且 cc -c FILENAME.c 也會被推導出來,於是,我們的makefile 再也不用寫得這么復雜。我們的新makefile就可以這么寫了。
這種方法,也就是make的**。上面文件內容中,「.PHONY」表示,clean是個偽目標文件。
㈤ Linux平台Makefile文件的編寫基礎篇
目的:
基本掌握了 make 的用法,能在Linux系統上編程。
環境:
Linux系統,或者有一台Linux伺服器,通過終端連接。一句話:有Linux編譯環境。
准備:
准備三個文件:file1.c, file2.c, file2.h
file1.c:
#include
#include "file2.h"
int main()
{
printf("print file1$$$$$$$$$$$$ ");
File2Print();
return 0;
}
file2.h:
#ifndef FILE2_H_
#define FILE2_H_
#ifdef __cplusplus
extern "C" {
#endif
void File2Print();
#ifdef __cplusplus
}
#endif
#endif
file2.c:
#include "file2.h"
void File2Print()
{
printf("Print file2********************** ");
}
基礎:
先來個例子:
有這么個Makefile文件。(文件和Makefile在同一目錄)
=== makefile 開始 ===
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld
file1.o:file1.c file2.h
gcc -c file1.c -o file1.o
file2.o:file2.c file2.h
gcc -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 結束 ===
一個 makefile 主要含有一系列的規則,如下:
A: B
(tab)
(tab)
每個命令行前都必須有tab符號。
上面的makefile文件目的就是要編譯一個helloworld的可執行文件。讓我們一句一句來解釋:
helloworld : file1.o file2.o: helloworld依賴file1.o file2.o兩個目標文件。
gcc File1.o File2.o -o helloworld: 編譯出helloworld可執行文件。-o表示你指定 的目標文件名。
file1.o : file1.c: file1.o依賴file1.c文件。
gcc -c file1.c -o file1.o: 編譯出file1.o文件。-c表示gcc 只把給它的文件編譯成目標文件, 用源碼文件的文件名命名但把其後綴由「.c」或「.cc」變成「.o」。在這句中,可以省略-o file1.o,編譯器默認生成file1.o文件,這就是-c的作用。
file2.o : file2.c file2.h
gcc -c file2.c -o file2.o
這兩句和上兩句相同。
clean:
rm -rf *.o helloworld
當用戶鍵入make clean命令時,會刪除*.o 和helloworld文件。
如果要編譯cpp文件,只要把gcc改成g++就行了。
寫好Makefile文件,在命令行中直接鍵入make命令,就會執行Makefile中的內容了。
到這步我想你能編一個Helloworld程序了。
上一層樓:使用變數
上面提到一句,如果要編譯cpp文件,只要把gcc改成g++就行了。但如果Makefile中有很多gcc,那不就很麻煩了。
第二個例子:
=== makefile 開始 ===
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -Wall -O -g
helloworld : $(OBJS)
$(CC) $(OBJS) -o helloworld
file1.o : file1.c file2.h
$(CC) $(CFLAGS) -c file1.c -o file1.o
file2.o : file2.c file2.h
$(CC) $(CFLAGS) -c file2.c -o file2.o
clean:
rm -rf *.o helloworld
=== makefile 結束 ===
這里我們應用到了變數。要設定一個變數,你只要在一行的開始寫下這個變數的名字,後 面跟一個 = 號,後面跟你要設定的這個變數的值。以後你要引用 這個變數,寫一個 $ 符號,後面是圍在括弧里的變數名。
CFLAGS = -Wall -O –g,解釋一下。這是配置編譯器設置,並把它賦值給CFFLAGS變數。
-Wall: 輸出所有的警告信息。
-O: 在編譯時進行優化。
-g: 表示編譯debug版本。
這樣寫的Makefile文件比較簡單,但很容易就會發現缺點,那就是要列出所有的c文件。如果你添加一個c文件,那就需要修改Makefile文件,這在項目開發中還是比較麻煩的。
再上一層樓:使用函數
學到這里,你也許會說,這就好像編程序嗎?有變數,也有函數。其實這就是編程序,只不過用的語言不同而已。
第三個例子:
=== makefile 開始 ===
CC = gcc
XX = g++
CFLAGS = -Wall -O –g
TARGET = ./helloworld
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o [email protected]
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o [email protected]
SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))
$(TARGET) : $(OBJS)
$(XX) $(OBJS) -o $(TARGET)
chmod a+x $(TARGET)
clean:
rm -rf *.o helloworld
=== makefile 結束 ===
函數1:wildcard
產生一個所有以 '.c' 結尾的文件的列表。
SOURCES = $(wildcard *.c *.cpp)表示產生一個所有以 .c,.cpp結尾的文件的列表,然後存入變數 SOURCES 里。
函數2:patsubst
匹配替換,有三個參數。第一個是一個需要匹配的式樣,第二個表示用什麼來替換它,第三個是一個需要被處理的由空格分隔的列表。
OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字元變成.o,形成一個新的文件列表,然後存入OBJS變數中。
%.o: %.c
$(CC) $(CFLAGS) -c lt; -o [email protected]
%.o:%.cpp
$(XX) $(CFLAGS) -c lt; -o [email protected]
這幾句命令表示把所有的.c,.cpp編譯成.o文件。
這里有三個比較有用的內部變數。 [email protected] 擴展成當前規則的目的文件名, lt; 擴展成依靠 列表中的第一個依靠文件,而 $^ 擴展成整個依靠的列表(除掉了裡面所有重 復的文件名)。
chmod a+x $(TARGET)表示把helloworld強制變成可執行文件。
㈥ 在VC里如何用Makefile文件編譯
運行cmd.exe (or command.com in win9x)->進到vc/bin目錄->運行vc-vars32.bat->進到makefile 所在的目錄->nmake /f makefile
從sourceforge上下載下來的libjpeg源代碼中有一個makefile.vc的文件,可以通過nmake /f makefile.vc [nodebug=1]來編譯libjpeg,但是只能編譯靜態庫,如果需要編譯dll以便在emacs等程序中使用的話,需要修改makefile.vc和jmorecfg.h文件。在makefile.vc文件中添加編譯dll規則:
以下內容為程序代碼:
libjpeg.lib: $(LIBOBJECTS) $(RM) libjpeg.lib lib -out:libjpeg.lib $(LIBOBJECTS) #
添加以下這行 libjpeg.dll: $(LIBOBJECTS) $(RM) libjpeg.dll link -dll -out:libjpeg.dll $(LIBOBJECTS) 在jmorecfg.h中添加#define _WIN32_#define JPEG_DLL 然後nmake /f makefile.vc nodebug=1就可以編譯了。
將makefile復制為一個.mak文件,然後用VC打開即可!
.mak 就是一個makefile
可以指定怎樣編譯(命令行,必須先設置VC命令行環境)
vcvars32.bat可設置環境,在vc98/bin下 nmake /f XXXX.mak
如果有一個makefile就只要nmake就可以了。
㈦ 如何使用makefile
以hello_test.c文件為例
1.創建程序
在linux控制台界面下 ,輸入vi hello_test.c,輸入i進入編輯插入模式,輸入代碼如下:
#include <stdio.h>
int main(void)
{
printf("Hello,Word!/n");
return 0;
}
用gcc編譯程序
輸入命令:gcc hello_test.c
輸入命令:ls
顯示:a.out hello_test.c
輸入命令:./a.out //執行程序
2.使用Makefile
(1)創建Makefile,在hello_test.c所在目錄輸入 vi Makefile
(2)輸入Makefile內容。在vi插入模式下輸入:
hello_test : hello_test.c
gcc -o hello_test hello_test.c //特別注意 gcc前面不是空格,而是tab間隔符,否則會出現makefile:2: *** 遺漏分隔符錯誤
clean :
rm -fr hello_test *.o *.core
(3)輸入make,屏幕輸出 gcc -o hello_test hello_test.c,表示編譯已經通過。
生成 hello_test。
㈧ 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發現有未定義的變數,那麼就輸出警告信息。
㈨ c語言編譯運行出現Makefile.win已經改變,怎麼改
這個提示是說你當前項目里有多個文件里都有叫main的函數,這樣會導致系統不清楚從哪個main執行,建議你可以把其它文件里的main隨便改下下名字比如叫main1什麼的,只把你當前要運行的文件里的主函數改為main就行了。
或者建議如果只有一般的測試代碼只有一個文件的那種,新建的時候就不要建項目,直接建文件就可以了。
㈩ iar使用makefile編譯
要編譯出在 iar開發板上運行的可執行文件,需要使用到交叉編譯器 iar-linux-gnueabihf-gcc 來編譯,在終端中輸入如下命令:
iar-linux-gnueabihf-gcc -g -c led.s -o led.o
上述命令就是將 led.s 編譯為 led.o,其中「-g」選項是產生調試信息,GDB 能夠使用這些
調試信息進行代碼調試。「-c」選項是編譯源文件,但是不鏈接。「-o」選項是指定編譯產生的文
件名字,這里我們指定 led.s 編譯完成以後的文件名字為 led.o。執行上述命令以後就會編譯生
成一個 led.o 文件
2 、arm-linux-gnueabihf-ld 鏈接文件
arm-linux-gnueabihf-ld 用來將眾多的.o 文件鏈接到一個指定的鏈接位置。我們在學習SMT32 的時候基本就沒有聽過「鏈接」這個詞,我們一般用 MDK 編寫好代碼,然後點擊「編
譯」,MDK 或者 IAR 就會自動幫我們編譯好整個工程,最後再點擊「下載」就可以將代碼下載
到開發板中。這是因為鏈接這個操作 MDK 或者 IAR 已經幫你做好了,因此我們現在需要做的就是確定一下本試驗最終的可執行文件其運行起始地址,也就是鏈接地址。這里我們要區分「存儲地址」和「運行地址」這兩個概念,「存儲地址」就是可執行文件存儲在哪裡,可執行文件的存儲地址可以隨意選擇。「運行地址」就是代碼運行的時候所處的地址,這個我們在鏈接的時候就已經確定好了,代碼要運行,那就必須處於運行地址處,否則代碼肯定運行出錯。比如設備支持 SD 卡、EMMC、NAND 啟動,因此代碼可以存儲到 SD 卡、EMMC 或者 NAND 中,但是要運行的話就必須將代碼從 SD 卡、EMMC 或者NAND 中拷貝到其運行地址(鏈接地址)處,「存儲地址」和「運行地址」可以一樣,比如STM32 的存儲起始地址和運行起始地址都是 0X08000000,輸入如下命令
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中-Ttext 就是指定鏈接地址,「-o」選項指定鏈接生成的 elf 文件名,這里我們命名
為 led.elf