1. 程式人生 > >多檔案編譯的makefile編寫(附當前目錄下所有.c/.cpp檔案編譯makefile)

多檔案編譯的makefile編寫(附當前目錄下所有.c/.cpp檔案編譯makefile)

C程式碼是如何變成可以執行程式的過程:

    1、由前處理器把程式設計師所編寫的C程式碼翻譯成標準C程式碼,可以得到以.i結尾的預處理檔案。
        gcc -E code.c
        gcc -E code.c -o code.i 
    2、由彙編器把標準的C程式碼生成彙編程式碼,可以得到以.s結尾的彙編檔案。
        gcc -S code.i
    3、由翻譯器把彙編檔案生成二進位制的檔案,得到.o結尾的目標檔案。
        gcc -c code.s
    4、由連結器把若干個目標檔案合併在一起生成可執行檔案,預設得到a.out。

        gcc code1.o code2.o code3.o

單檔案程式設計:

    當只有一個.c檔案,例如test.c  這時只要輸入

gcc test.c -o test

    此時生成可執行檔案test,只要輸入./test就可以執行程式並得到結果了

多檔案程式設計 :

    1、把一個專案分解成不同的模組,會有若干個.c,一個.c檔案會生成一個.o檔案,然後再最終合併成一個可以執行程式。

    2、各個.c檔案各司其職,負責實現功能程式碼,如果相互之間需要呼叫,先用.h檔案中的內容解決編譯錯誤,然後在連結過程中各自尋找需要的程式碼。

    3、.h檔案中具要負責的內容有,函式的宣告,變數的宣告,等一些不需要佔用記憶體的宣告語句。

    4、一般一個.h對應一個.c檔案,要.c中把.h引入,如果.h與.c宣告的函式不相符,會有錯誤提示。

Makefile指令碼編寫:

    1.用來編譯程式碼的指令碼程式,裡面記錄的是編譯程式碼的步驟。

    2.在終端的命令列中執行make命令,系統會自動呼叫Makefile檔案中的內容執行(make)。

    3.在執行make時,不是所有的.c檔案都會被重新編譯,只有被修改的.c檔案才會再次編譯(它是通過監控檔案的修改時間來提高編譯效率)

Makefile的主要內容:
        定義變數
            CC
            STD
            SRC
            OBJ
            BIN
            FLAG
            
        入口目標:目標名
            預設位置排列在第一個的目標是入口目標,預設只執行它。
            
        普通目標
            好比自定義函式,可以通過被依賴,達到被執行的目的。  
            普通目標也可以依賴其它普通目標,達到多個目標被執行的目的。
            
        清理目標:
            預設不執行,當程式編譯成功時,把目標檔案清理掉。
            或者系統時間出現問題,需要重新編譯所有檔案時。

            make 目標名

示例:

CC = gcc

STD = -std = gnu99

BIN = start

OBJ = main.o function.o extra_func.o

FLAG = -g

all:$(OBJ)
	$(CC) $(STD) $(FLAG) $(OBJ) -o $(BIN)

$.o:%.c
	$(CC) $(STD) -c $< -o [email protected]

clean:
	rm $(OBJ) $(BIN)

CC為編譯器  選擇gcc

STD為編譯標準 這裡選擇gnu99

BIN為可執行檔名稱

OBJ為目標檔案 也就是字尾為.o的檔案

FLAG 為編譯引數,-g為在編譯的時候,產生除錯資訊

$()會自動替換為對應的值

clean會在每次make編譯後清理目標檔案和可執行檔案 

CC = gcc

STD = -std=gnu99

CFLAGS = -g -Wall 
 
SRC = $(wildcard *.c)

OBJ = $(patsubst %c, %o, $(SRC))

BIN = a.out
 
all:$(OBJ)
	$(CC) $(OBJ) -o $(BIN)

%.o:%.cpp
	$(CC) $(STD) $(CFLAGS) -c $< -o [email protected]

clean:
	rm  $(BIN) $(OBJ)

要編譯多檔案cpp只需要將.c換成.cpp ,gcc改成g++,-std=gnu99 換成 -std=c++0x

相關推薦

檔案編譯makefile編寫(當前目錄所有.c/.cpp檔案編譯makefile)

C程式碼是如何變成可以執行程式的過程:     1、由前處理器把程式設計師所編寫的C程式碼翻譯成標準C程式碼,可以得到以.i結尾的預處理檔案。         gcc -E code.c         gcc -E code.c -o code.i      2、由彙編器

Linux如何編譯檔案(包括不同目錄的.c/.h檔案)的C/C++程式

在Linux下要編譯一個C/C++程式,首先要知道包含目錄的作用,對C/C++有了解的就會知道,#include是包含標頭檔案所用的,也就說說部分類、函式、或者變數宣告就在其中。而#include巨集定義又有兩種: #include""和#include <>

vba查詢當前目錄所有文字檔案中滿足正則表示式要求的字串

Dim DicFolders As Variant Private Sub ExportFormat(format As String) Dim ArrFileName() As String, ArrLan() As String, i& Dim sheetName As

linux命令列查詢當前目錄所有檔案是否包含特定string

grep // -n 帶行號 (自測可用) #grep -n -r "blog_name," * wp-admin/admin-header.php:118:unset($title_cla

linux在當前目錄根據檔名查詢檔案

find | grep luoluo 將當前目錄下(包括子目錄)的檔名中含有luoluo的檔案過濾出來 即使是當前目錄子目錄下的檔案,也能被找出來。 find | xargs grep luoluo 將當前目錄下(包括子目錄)的檔案內容中含有luoluo的行過濾

sed 和 grep 命令修改當前目錄所有檔案

把 當前目錄下的包含 com.android.dialer.R 的所有檔案中的 com.android.dialer.R 改成 com.android.contacts.R sed -i 's/

Linux目錄遍歷實現 -- 列出當前目錄所有檔案

遞迴遍歷目錄,列出目錄中的檔案,程式碼: #include <stdio.h> #include <stdlib.h> #include <string.h>

python檢視當前目錄所有檔案和資料夾

檢視當前目錄所有檔案:import os print(os.listdir('.'))檢視當前目錄所有資料夾:import os path = os.listdir(os.getcwd()) for p in path: if os.path.isdir(p):

windows使用命令列快速刪除當前目錄所有指定字尾的檔案

windows的cmd命令有個del命令,可以快速地刪除所有指定檔案。 例如現在用vs2010工作路徑下的資料夾,需要刪除一些無用的檔案如.sdf、.suo、.log等結尾的無用檔案刪除。可以編寫如

python-快速將當前目錄的.tar.gz檔案解壓縮

#!/usr/bin/python # -*- coding:gbk -*- import tarfile import os #獲得目錄下的所有檔案 def get_file_name(file_dir): L=[] for root,dirs,files in os

檢查當前目錄損壞的圖片檔案並刪除

# encoding: UTF-8 # # Project: CheckImages # Author: borlittle # CreateDate: 2018/6/9 """ BriefIntroduction: Update: Reference: Ru

遍歷目錄所有各級子目錄檔案的全路徑

public System.Collections.Specialized.StringCollection GetAllFiles(string rootdir){ System.Collections.Specialized.StringCollection result

編寫一個search(s)的函式,將當前目錄及其所有子目錄查詢檔名包含指定字串的檔案,列印完整路徑

最後的練習:編寫一個search(s)的函式,能在當前目錄以及當前目錄的所有子目錄下查詢檔名包含指定字串的檔案,並打印出完整路徑 在編寫的過程中,對目錄遍歷的寫法有疑惑。經過除錯和搜尋,定位到 os.path.isfile有問題: 最後完成結果:

python中編寫一個程式,能在當前目錄以及當前目錄所有子目錄查詢檔名包含指定字串的檔案,並打印出相對路徑—— python學習筆記

1. 題目: 編寫一個程式,能在當前目錄以及當前目錄的所有子目錄下查詢檔名包含指定字串的檔案,並打印出相對路徑。 2. 解答 import os # 引入os "編寫一個程式,能在當前目錄以及當前目錄的所有子目錄下查詢檔名包含指定字串的檔案,並打印出相對路徑" def se

【Matlab轉換csv】將當前目錄面的csv檔案轉換.mat檔案

clear clc close all; % get file names file_names = dir('*.csv'); var_names = []; for i = 1 : numel(file_names) file_name = file_names(i).nam

Linux檢視當前目錄檔案/目錄數量

1) 統計當前資料夾下檔案的個數: ls -l |grep "^-"|wc -l   2) 統計當前資料夾下目錄的個數: ls -l |grep "^d"|wc -l   3) 統計當前資料夾下檔案的個數,包括子資料夾裡的 : ls -lR|grep

python 列出出當前目錄所有子目錄檔案

[[email protected] test]# cat walk.py #!/usr/bin/python # -*- coding: UTF-8 -*- import os for root, dirs, files in os.walk("/tmp", topdown=False)

linux查詢當前目錄所有檔案大小和清空檔案內容命令

  查詢當前目錄下的所有檔案大小:du -sh *  刪除檔案:rm - rf xxx.log 列印日誌:tail -f xxx.log 檢視程序ps -ef | grep java | grep -v grep 殺死客戶端kill -9 14569 - 啟動

一個將當前目錄HEX檔案的第一行資料刪除的程式

為什麼要寫這樣一個函式 在使用SoftConsole開發M3程式時,生成的hex檔案,必須要把第一行資料刪除,才能在Libero中使用,所以寫了這個小工具,這是2.0版本了,第一版是直接刪除第一行資料,有可能會導致誤操作。 實現原理 主要使用到了bat批處理命令