1. 程式人生 > >Makefile的簡單編寫

Makefile的簡單編寫

當我們的工程越來越大的以後,每次都使用命令編譯顯得非常的麻煩.所以我們需要一個自動化編譯的工具來幫助我們編譯.在我們使用原始碼安裝軟體的時候都會有make,make install等操作,這個就是使用Makefile來進行自動化編譯的工作的.

Makefile也是一個指令碼檔案和shell指令碼非常的相似,但是也有很多的地方不一樣.

程式編譯通常會有一下幾個步驟,先是預編譯,然後將C語言程式碼編譯成彙編,然後在將彙編編譯成二進位制檔案.o檔案,然後將所有的.o檔案連線起來就得到了可執行檔案.

在編寫Makefile時,我們先將所有的c語言程式碼編譯成二進位制檔案,然後將所有二進位制檔案連結起來.

和shell類似的,裡面有變數,有命令,有迴圈,判斷等語句,所有的命令都需要另起一行,而且開始必須是tab鍵(所有開頭是tab鍵的行都會被認為是命令,哪怕不能執行),變數等必須頂行不能有空格等.

簡單的Makefile格式(不涉及迴圈,選擇等語句):

TARGET... : PREREQUISITES...
  COMMAND

a:main.o

  gcc -o main.o

main.o:main.c

  gcc -c main.c

這樣就是一個最簡單的Makefile

當然我們如果是檔案多的話這樣寫就非常的麻煩,我們就可以使用 變數名 += .....來進行編輯,使用時直接$(變數名)來使用.(和shell一樣)

我們也常常會使用make clean的命令等,這個叫做偽目標,直接

clean:

  rm *.o

install:

  cp .. /bin

Makefile檔案也可以應用其他的Makefile檔案

include 檔名

在我們寫了.o檔名以後,當.o和.c檔案是同名時,我們也可以不用.c檔案,make會自動查詢同名的檔案,例如%.o:%.c.

以下是一些自動化變數:

[email protected]
表示規則的目標檔名。如果目標是一個文件檔案(Linux中,一般稱.a檔案為文件檔案,也稱為靜態庫檔案) ,那麼它代表這個文件的檔名。在多目標模式規則中,它代表的是哪個觸發規則被執行的目標檔名。

$%
當規則的目標檔案是一個靜態庫檔案時,代表靜態庫的一個成員名。例如,規則的目標是 “foo.a(bar.o)” , 那麼, “$%” 的值就為 “bar.o” , “[email protected]

” 的值為“foo.a” 。
如果目標不是靜態庫檔案,其值為空。

$<
規則的第一個依賴檔名。 如果是一個目標檔案使用隱含規則來重建, 則它代表由隱含規則加入的第一個依賴檔案。

$?
所有比目標檔案更新的依賴檔案列表,空格分割。如果目標是靜態庫檔名,代表的是庫成員(.o檔案) 。

$^
規則的所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔案,它所代表的只能是所有庫成員(.o檔案)名。一個檔案可重複的出現在目標的依賴中,變數“$^”只記錄它的一次引用情況。就是說變數“$^”會去掉重複的依賴檔案。

$+
類似“$^” ,但是它保留了依賴檔案中重複出現的檔案。主要用在程式連結時庫的交叉引用場合。

$*
$* 這個變量表示目標模式中“%”及其之前的部分。如果目標是“dir/a.foo.b”,並且目標的模式是“a.%.b”,那麼,“$*”的值就是“dir/a.foo”。這個變數對於構造有關聯的檔名是比較有較。如果目標中沒有模式的定義,那麼“$*”也就不能被推匯出,但是,如果目標檔案的字尾是make所識別的,那麼“$*”就是除了字尾的那一部分。例如:如果目標是“foo.c”,因為“.c”是make所能識別的字尾名,所以,“$*”的值就是“foo”。這個特性是GNU make的,很有可能不兼容於其它版本的make,所以,你應該儘量避免使用“$*”,除非是在隱含規則或是靜態模式中。如果目標中的字尾是make所不能識別的,那麼“$*”就是空值。

以下是一般的簡單的Makefile寫法:

COBJS += main.o

#CFLAGS += -O2 -Wall -DDEBUG
CFLAGS += -I./

LDFLAGS += -lmxml -lpthread

CROSS_COMPILE ?=

CC = $(CROSS_COMPILE)gcc

TARGET = tag

all:$(TARGET)
$(TARGET):$(COBJS)
$(CC) -o [email protected] $^ $(LDFLAGS)

%.o:%.c
$(CC) $(CFLAGS) -c -o [email protected] $^ $(LDFLAGS)

.PHONY:clean
clean:
rm -f $(COBJS)

相關推薦

Makefile簡單編寫例項

介紹一下Makefile的簡單編寫例子。 編寫Makefile的規則就是: 目標檔案:依賴檔案 (tab)編譯規則 現在我有一個檔案目錄結構為: 解釋一下這幾個檔案。首先我建立makefile目錄,底下有一個include目錄和src目錄。include目錄存放一個head.h標頭檔案,是我們sr

makefile簡單編寫-生成可執行檔案

makefile 要想把寫好的程式放到linux下編譯,必不可少的要使用到makefile檔案。makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。下面講下makefile簡單的

linux動態庫及靜態庫的製作 和makefile簡單編寫

一.庫什麼是庫,簡單的可以說是可執行程式碼的二進位制形式,能夠被作業系統載入記憶體執行。作業系統的不同,二者的庫也是不相容的,如windows與linux.庫又分為靜態庫和動態庫,動態庫又稱為共享庫。linux下靜態庫(.a)檔案,動態庫(.so)檔案。主要存放函式庫的路徑有

Makefile簡單編寫

當我們的工程越來越大的以後,每次都使用命令編譯顯得非常的麻煩.所以我們需要一個自動化編譯的工具來幫助我們編譯.在我們使用原始碼安裝軟體的時候都會有make,make install等操作,這個就是使用Makefile來進行自動化編譯的工作的.Makefile也是一個指令碼檔案

Makefile和shell指令碼簡單編寫

CROSS =/opt/hisi-linux-nptl/arm-hisiv100-linux/bin/arm-hisiv100-linux-uclibcgnueabi-#CROSS =SRCDIRS =./ \./include\./src\./gsoap\ASFLAGS =CFLAGS =-WallCX

nginx自定義站點目錄及簡單編寫開發網頁內容講解

linux[[email protected]/* */ conf]# egrep -v "^$|#" nginx.conf.default >nginx.conf[[email protected]/* */ conf]# pwd/application/nginx/conf[

12)登錄驗證函數簡單編寫驗證

.html .com logs 測試版 nbsp http htm images 登錄 直接展示我的check函數,就是一個測試版:   然後我的login.html代碼的那個地址欄:     結果展示:      12)登錄驗證函數簡單編寫驗證

yxr:Makefile 簡單樣本

簡單 分享 .cpp 打印 ima 沒有 http alt lib yxr:搜集了不少makefile技巧,但是沒有一個從頭到尾,能夠拿來就用的。工作需要,寫了一個C++的簡單makefile,記錄下來,以備使用。 1)Makefile中有不少已經存在的缺省變量,比如C

Makefile 簡單例子1

roo makefile 測試 變量 span objects add 測試環境 rwx 測試環境 root@ubuntu16:/home/ubuntu16/code2# ll 總用量 32 drwxr-xr-x 2 root root 4096 9月

簡單編寫向下取整 - C++描述

簡單編寫向下取整 - C++描述 問題提出 在很多語言中,簡單的/符號可以很快幫我們取整,那麼如何更基本地實現這個小演算法呢? 基本思路 如果有兩個正整數a和b,那麼計算a/b=x 就等價於計算: ⌊a÷b

01-簡單編寫http伺服器

package com.day3; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.sql.Array;

自動萬能makefile(linux ubuntu gcc/g++),讓makefile編寫不在煩人

自動萬能makefile(linux ubuntu gcc/g++),讓makefile的編寫不在煩人 keyword: wildcard notdir patsubst findstring wordlist suffix foreach

makefile 簡單例項

文章目錄 1 makefile 基本結構 2 Makefile 例項 2.1 專案檔案 2.2 makefile 編寫(不生成庫) 2.3 makefile 編寫(生成動態庫) 2.4 makefile

【Linux】makefile編寫

昨天把程式移植到linux改了bug以後,感覺好麻煩 每次編譯都要輸那麼長一堆命令,容易輸錯,而且沒有變的原始碼也順便重新編譯了一次,很浪費時間。 當時用了別名,發現不能實現需求。 嗯,學一學makefile怎麼寫 基本語法 target : prerequisites <ta

Makefile編寫

1生成可執行檔案: #source file #原始檔,自動找所有.c和.cpp檔案,並將目標定義為同名.o檔案 SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c,%.o,$(pat

Makefile編寫快速入門

Makefile的編寫快速入門 一、Makefile編寫須知 二、簡單的Makefile的編寫 三、通用Makefile的編寫 四、使用 在學習Linux下使用C語言程式設計的時候,我們需要為自己的專案編寫一個Ma

Makefile簡單入門基礎

本文章是參考韋東山第一期ARM裸機加強Makefile相關內容。 參考連結:百問科技wiki教程Makefile 一、gcc編譯過程詳解 1、gcc的使用方法:gcc [選項] 檔名 2、gcc常用選項 一個c/c++檔案要經過預處理、編譯、彙編和連結才

【PE】搭建支援C99原始碼編譯的vs2010工程的方法(附MinGW下Windows GNU makefile編寫)

DATE: 2018.12.10 1、前言     最近在編譯一份開原始碼時,由於VS對最新標準C實現C99的支援性差,在搭建編譯環境過程中遇到了一些問題,特記錄於此。     現在很多開原始碼(比如x264,ffmpeg)中的C程式碼都採用c99規範,Linux gcc編

嵌入式驅動關於Makefile編寫例子

linux 驅動總結 linux驅動接口裡的_init _exit 其實就是巨集。 linux驅動程式不能用GCC直接編譯生成模組。要用makefile ifneq ($(KERNELRELE

簡單編寫php驗證類,教你如何寫好php程式(含多種驗證規則)

很多人在開發網站的時候往往只是通過簡單的js驗證,當你一不小心在js中多寫了個逗號或者點號,ie6無法識別就直接跳過驗證了。其實最安全的做法還是需要在服務端對使用者輸入的資料做驗證的。本人寫了個簡單的php驗證類,含多種驗證規則,供大家學習參考。原文連結 <?php