1. 程式人生 > >多個原始檔進行編譯,即 makefile 的編寫

多個原始檔進行編譯,即 makefile 的編寫

makefile的好處是防止原始檔的重複編譯

比如有好多個原始檔,某天對其中一個原始檔進行修改,如果不寫makefile的話,需要將整個工程的所有檔案重新編譯一遍,非常麻煩,有了makefile,說明了每個原始檔的依附關係,當某個原始檔改變的時候只需重新編譯一下關聯的原始檔就好。

例如:有以下檔案

one.h

one.c

two.h

two.c

main.c

main.c 中引入one.h 和two.h兩個標頭檔案,one.c two.c 分別實現兩個標頭檔案中定義的函式

有兩種方式編譯執行該程式,

一:手動單獨編譯

gcc -c one.c

gcc -c two.c

gcc -c main.c

gcc -o main main.o one.o two.o

./main

二:makefile


那麼只需在任何一個文字編輯器裡面寫下如下命令,並儲存為makefile

main:main.o one.o two.o

tab鍵gcc(或者cc)-o main main.o one.o two.o

main.o:main.c one.h two.h

tab鍵gcc(或者cc)-c main.c


one.o:one.c one.h

tab鍵gcc(或者cc)-c one.c

two.o:two.c two.h

tab鍵gcc(或者cc)-c two.c

這些原始檔都需要在同一個目錄下,並且在main.c中引入one.h 和two.h的時候要用"one.h" "two.h"不要用<>否則編譯器會到系統類庫檔案中去找,是找不到的。

然後在同一目錄的終端下,輸入make命令,那麼編譯就開始了,沒有什麼錯誤的話,執行./main就可以讓你的程式跑起來了。

還可以對makefile進行精簡:

首先有三個符號:

1 [email protected] 代表目標檔案

2 $< 代表第一個檔案

3$^ 代表所有依賴檔案

所以上面命令可以精簡為:

main:main.o one.o two.o

tab鍵gcc(或者cc)-o [email protected] $^


main.o:main.c one.h two.h

tab鍵gcc(或者cc)-c $<


one.o:one.c one.h

tab鍵gcc(或者cc)-c $<


two.o:two.c two.h

tab鍵gcc(或者cc)-c $<

以上makefile還可以精簡:

一個新的符號:.c.o

該符號自動搜尋相關聯的原始檔和標頭檔案

於是makefile還可以寫為:


main:main.o one.o two.o

tab鍵gcc(或者cc)-o [email protected] $^

.c.o: 
tab鍵gcc(或者cc) $<

最好在加上clean命令,將生成的目標檔案和執行檔案刪除,遵守優雅簡潔原則,呵呵,方便再次編譯

clean:

ab鍵gcc(或者cc)rm main main.o one.o two.o


makefile的格式大家要記住了,至於問什麼這樣寫,只能說這是標準,makefile還有很多高深的用法,以後在逐漸去學習。

相關推薦

原始檔進行編譯 makefile編寫

makefile的好處是防止原始檔的重複編譯 比如有好多個原始檔,某天對其中一個原始檔進行修改,如果不寫makefile的話,需要將整個工程的所有檔案重新編譯一遍,非常麻煩,有了makefile,說明了每個原始檔的依附關係,當某個原始檔改變的時候只需重新編譯一下關聯的原始

如何將C檔案連結在一起----Makefile編寫及make指令

需使用GCC編譯器,關於MinGW的安裝指南:https://people.eng.unimelb.edu.au/ammoffat/teaching/20005/Install-MinGW.pdf   單個.c檔案且沒有使用自定義標頭檔案的編譯,在命令列:   &nbs

原始檔編譯--makefile

main.c 中引入one.h 和two.h兩個標頭檔案,one.c two.c 分別實現兩個標頭檔案中定義的函式 有兩種方式編譯執行該程式, 一:手動單獨編譯 gcc -c one.c g

原始檔編譯成一個模組注意Makefile 書寫

多個原始檔編譯成一個模組,不正確的Makefile 會使printk 不能輸出資訊。 細細觀測,發現是對Makefile 語法未深刻理解所致。 下面附上一例說明問題。 -----------------------------------------------------

linux 核心模組程式設計之編譯原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

pytorch綜合弱分類器投票機制進行手寫數字分類(boosting)

首先,這個文章的出發點就是讓一個網路一個圖片進行預測,在直觀上不如多個網路對一個圖片進行預測之後再少數服從多數效果好。 也就是對於任何一個分類任務,訓練n個弱分類器,也就是分類準確度只比隨機猜好一點,那麼當n足夠大的時候,通過投票機制,也能提升很大的準確度:畢竟每個網路都分錯同一個資料的可能

SQL 用條件進行排序;以及根據一個條件的進行排序

1、先說第一個用多個條件進行排序      ORDER BY name,age       (多條件排序,還有條件可以再加在後面)      ORDER BY name desc,age&nb

檔案進行壓縮處理然後傳輸到伺服器

目前專案正需要多個檔案壓縮上傳,在這裡遇到一些坑與解決方案。 我這裡的問題是從印表機影印,掃描時候的留底檔案。在拿到檔案路徑後,就要根據這個路徑拿到檔案,進行壓縮傳輸,可供下載。 其中遇到的問題 1、使用這個thumbnailator-0.4.7.jar對圖片進行再壓縮,會

Codeblocks編譯原始檔

當我們同時編譯多個檔案時,一個是a.c,另一個是main.c。下面是a.c的內容#include<stdio.h> char a = 'A'; void msg() { printf("Hello\n"); }下面是main.c的內容#include

在Linux 下編譯連結原始檔

add.c 的內容 int Add(int a,int b) {   int result;   result=a+b;   return  result;} minus.c 的內容 int Minus(int a,int b){  int result;  result

C#程序調用cmd.exe執行其他exe進程(並且含參數)並把進程結果返回給字符串

() stat syntax || 錯誤 void dia clas ring 1.關鍵代碼部分。 using System.Diagnostics; public class CmdHelper {

jsp實現仿QQ空間新建相冊名稱向相冊中加入照片

ext forname parseint type 登錄失敗 ocr cli str null 工具:Eclipse,Oracle,smartupload.jar。語言:jsp,Java;數據存儲:Oracle。 實現功能介紹: 主要是新建相冊,能夠建多個相冊,

你需要實現一個高效的緩存它允許用戶讀但只允許一個用戶寫

讀寫鎖思路:java.util.concurrent.locks包下面ReadWriteLock接口,該接口下面的實現類ReentrantReadWriteLock維護了兩個鎖讀鎖和解鎖,可用該類實現這個功能,很簡單import java.util.Date; import java.util.concurr

RF合並output文件並生成新的log和report文件

結果 png 多個 路徑 行合並 保存 rep out ron 合並兩個output文件並生成新的log和report文件命令: rebot -d 合並生成的log和report文件保存路徑 第1個output文件 第2個output文件 通過執行套件層.txt將結

IIS https綁定主機頭方法(可實現禁止直接通過IP訪問好像還可以實現IIS中綁定https<是使用單域名證書域名證書>)

多個 nbsp app for iis 直接 fig protoc eight 步驟: 打開:%systemroot%\SYSTEM32\inetsrv\config\ 打開:applicationHost.config 查找:<binding protocol="

有序數組實現歸並操作

進行 tro tor cli 解決 ID 最小值 方便 方法 工作中遇到了多個有序鏈的歸並操作,這裏記錄一下解決方法。方便後續使用。 歸並的方法列2種: (1) 堆排序, 或者勝利樹。減少比較次數。效率高,實現比較麻煩。 (2) 普通方法,每次都需要比較。實現簡單,一般

jQuery遍歷相同的class點選顯示隱藏圖示顯示及隱藏其下的內容

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=

用Python指令碼自動運營自媒體平臺不寫稿坐等收錢只告訴你原理

使用此方法最低成本不超過120元/年,年收入根據你所選擇垂直行業和帳號多少以及哪些平臺來決定 我所說的最低成本是針對我而言來說的,辛苦點的可以做到0成本操作,喜歡冒險的總投入不會超過5000塊錢 首先第一步就是你要有自媒體帳號,帳號和平臺不限,根據你對平臺的理解來自行選擇使用那個平臺,

在同一個tomcat下部署springboot專案時springboot專案無法正常啟動的問題

這個問題是基於,不使用springboot內建的tomcat會產生(即使用自己的tomcat時)。 今天在部署springboot專案的時候遇到了一個問題,怎麼部署都訪問不了,在網上查了很多原因,什麼pom.xml中依賴沒加,或者依賴衝突等等 各種原因都試了 ,結果還是訪問不了,這就