當前位置:首頁 » 編程軟體 » 生成makefile後怎麼編譯

生成makefile後怎麼編譯

發布時間: 2023-11-02 19:01:11

1. vc6.0怎麼使用makefile編譯,不要工程設置文件(dsp)

call VCVARS32.bat
nmake /NOLOGO /a /s /f XXX.mak

XXX.mak 為你的makefile文件。
把上面兩句話保存成文本文件,後綴名改為bat。 然後運行即可

2. 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是個偽目標文件。

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

4. 如何用makefile編譯多個c文件

假設有下面幾個c++文件:
wherewhen.h wherewhen.c
countdown.h countdown.c 包含了math.h, 需要連接庫文件
main.c 主函數, main.c 包含了兩個頭文件 wherewhen.h and countdown.h
1、第一種編譯方法:
g++ -Wall -g wherewhen.c countdown.c main.c -lm -o myprogram
生成可執行文件myprogram
2、第二中編譯方法, 分別編譯各個文件:
g++ -Wall -g -c wherewhen.c
g++ -Wall -g -c countdown.c
g++ -Wall -g -c main.c
g++ -g wherewhen.o countdown.o main.o -lm -o myprogram

5. C++的網頁游戲服務端源碼,包含makefile文件,該怎麼編譯

一般是分兩步:
(1) make
編譯
(2)make install
安裝

.project 等文件是 Eclipse等編輯器用的.
你也可以直接在編輯器里打開構建

6. Makefile.XX文件如何用make來編譯

1. 通過-f選項指定make的文件。
make -f Makefile.xx
2. (同樓上)把Makefile.xx文件修改為Makefile或makefile

7. 如何在makefile中定義宏進行條件編譯

你可以藉助BASHSHELL強大的字元串處理能力來實現啊!
比如你可以將你想定義的「宏」放在makefile.include中,然後將其賦值,而在makefile中加入include makefile.include一行,在其後需要進行條件預編譯時進行字元串比較來實現啊!

8. 如何使用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文件的話,那豈不是很繁?

熱點內容
hp存儲擴容 發布:2024-11-17 23:29:16 瀏覽:569
在ftp中put表示什麼 發布:2024-11-17 23:29:12 瀏覽:383
mvc多文件上傳 發布:2024-11-17 23:13:56 瀏覽:155
玩游戲硬碟緩存32m 發布:2024-11-17 23:03:42 瀏覽:525
藍光存儲系統 發布:2024-11-17 23:03:41 瀏覽:436
地平線4提示配置低於最低怎麼辦 發布:2024-11-17 22:54:38 瀏覽:610
注冊銀行卡賬戶密碼填什麼 發布:2024-11-17 22:54:35 瀏覽:537
java壓縮上傳圖片 發布:2024-11-17 22:26:59 瀏覽:627
plc編程課件 發布:2024-11-17 22:18:23 瀏覽:469
我的世界伺服器信號一直在檢測 發布:2024-11-17 22:09:52 瀏覽:547