1. 程式人生 > >一個簡單的Makefile,輔助在Linux上練習筆試題用

一個簡單的Makefile,輔助在Linux上練習筆試題用

##############################################################################
#                 簡易多模組程式自動編譯/清除Makefile
#簡介:    自動編譯、清除功能,不需要每次編譯輸入gcc或者rm指令
#使用方法: $make [OBJ=obj1.suffix[:obj2[:...]]] [TARGET=tool] [clean]
#
#使用說明:執行make指令將編譯/清除 $(SRC)/obj1.suffix $(SRC)/obj2.suffix ... 
#          如果是make exec指令,則生成可執行程式$(BIN)/tool
#          如果是make gdb指令,則啟動偵錯程式除錯可執行程式$(BIN)/tool
#          如果不指定TARGET,將預設使用obj1(第一個OBJ的字首名)作為輸出可執行程式名。
#
#注意事項:1.Makefile不檢查任何路徑,請確保您指定的各路徑有效
#
#示例:    1.$make OBJ=main.c:lib1:lib2 TARGET=tool
#            將編譯$(SRC)/main.c $(SRC)/lib1.c $(SRC)/lib2.c三個檔案
#            生成$(BIN)/main.o $(BIN)/lib1.o $(BIN)/lib2.o目標程式,
#            並連線三個目標程式生成可執行程式$(BIN)/tool
#
#          2.$make OBJ=main.c:lib1:lib2 TARGET=tool clean
#            將清除$(BIN)/main.o $(BIN)/lib1.o $(BIN)/lib2.o和$(BIN)/tool
#
#          Author: WKF4058, Date: 2013/12/30
#修改歷史:
#          2014-1-9:新增2個編譯過程中間輸出檔案:預處理.i,編譯.s
##################使用者配置選項################################################
#指定編譯器
CC = gcc
CXX = g++


#指定預設原始碼字尾名
SUFFIX = .c


#指定偵錯程式
GDB = `which gdb`


#指定編譯引數gdb除錯資訊
CFLAGS = -g


#目標程式名,支援多個OBJ,多個OBJ請使用:分割,請在make指令後接引數指定OBJ
#例如最簡單的編譯test.c 則應使用[
[email protected]
]$ make OBJ=test.c
OBJ = test.c


#可執行檔名,如果不指定,則預設與首個目標程式字首同名,無後綴名
TARGET =


#輸出目標程式目錄,最後一個/可寫可不寫
BIN = ./bin


#源程式檔案目錄,最後一個/可寫可不寫
SRC = ./src


#自定義包含檔案的搜尋路徑,以:分割,最後一個/可寫可不寫
VPATH += ./:./include
##############################################################################
##########make處理部分,非專業人士請勿擅自修改######################################
#如果BIN為空,則將BIN指定為當前目錄
ifeq ($(BIN),)
BIN := ./
endif


#如果引數指定了第一個目標的字尾名,則使用該字尾名作為原始碼字尾名
ifeq ($(suffix $(word 1,$(OBJ))), )
else
SUFFIX := $(suffix $(word 1, $(OBJ)))
endif


#根據原始碼重設編譯器
ifeq ($(SUFFIX),.cpp)
 CC := $(CXX)
endif
ifeq ($(SUFFIX),.cc)
 CC := $(CXX)
endif


#刪除路徑後面的斜線,並轉換為路徑序列
VPATH := $(patsubst %/,%,$(subst :, ,$(VPATH)))
BIN := $(patsubst %/,%,$(BIN))


#設定包含檔案搜尋路徑
CFLAGS += $(addprefix -I,$(VPATH))


#如果SRC為空,則將SRC指定為當前目錄
ifeq ($(SRC),)
SRC := ./
endif


#拼裝目標程式名
override OBJ := $(addsuffix .o,$(subst :, ,$(basename $(OBJ))))


#如果未指定可執行程式名或指定了空TARGET,則採用第一個OBJ的字首名作為可執行程式名
ifeq ($(TARGET),)
override TARGET := $(basename $(firstword $(OBJ)))
endif


#Makefile總入口
all: $(BIN)/$(TARGET)


#連線全部目標程式,生成可執行程式
$(BIN)/$(TARGET): $(addprefix $(BIN)/,$(OBJ))
$(CC) $(CFLAGS) $+ -o
[email protected]



#單獨分步編譯每個指定的目標程式
$(addprefix $(BIN)/,$(OBJ)): $(BIN)/%.o : $(SRC)/%$(SUFFIX)
$(CC) -E $(CFLAGS) $< -o $(patsubst %.o,%.i,[email protected])
$(CC) -S $(CFLAGS) $(patsubst %.o,%.i,[email protected]) -o $(patsubst %.o,%.s,[email protected])
$(CC) -c $(CFLAGS) $(patsubst %.o,%.s,
[email protected]
) -o [email protected]


#執行可執行程式
exec:
$(BIN)/$(TARGET)


#除錯可執行程式
gdb:
$(GDB) $(BIN)/$(TARGET)


#清除編譯結果
clean:
@echo Cleaning build...
rm -rf $(BIN)/$(TARGET) $(addprefix $(BIN)/,$(OBJ))
rm -rf $(patsubst %.o,$(BIN)/%.i,$(OBJ)) $(patsubst %.o,$(BIN)/%.s,$(OBJ))
##########################END#################################################
</pre><pre>

相關推薦

一個簡單Makefile輔助Linux練習試題

############################################################################## #                 簡易多模組程式自動編譯/清除Makefile #簡介:    自動編譯、清除功能

一個簡單的例子區分linux shell 正則表達式中的 *+,?

-s span TE 的區別 entos oot bar 一個 區分 1,linux shell 正則表達式 *和+號的區別例子記憶:[root@mycentos data]# touch test.txt[root@mycentos data]# cat>>t

簡單的方式在linux升級node.js版本

strong 解決方法 cal 穩定版 信息 解決 style alt 刪除 node的升級頻率太高,n模塊來升級是最方便的,網上看了很多資料介紹使用n模塊,但是安裝n模塊之後卻經常找不到這個命令 很多同學安裝之後直接去使用n會發現命令不存在,就停留在這一步無法前進了。

Xftp連接阿裏雲LinuxLinux傳文件Windows和Linux文件傳輸

技術 幫助 很多 blog 就是 希望 上傳 linu 好用 我之前是用SecureCRT連接阿裏雲Linux的,上傳文件用的Alt+p快捷鍵,感覺不是很方便。後來朋友給我推薦了Xshell,感覺確實好用得很多。 傳輸文件用的是Xftp,今天在向我的個人網站發布項目的時候總

java代碼linux刪除文件

return ret try flag 作文 exc post tac trace 1、其實在linux上和window是一樣的 2、path 傳入的路徑(直接從根目錄到你的文件的位置) public static boolean delFile(String path)

node起一個簡單服務打開本地項目或文件瀏覽

utf html vue content 名稱 控制臺 AC 運行 -type 1、安裝nodejs 2、在項目文件夾目錄下創建一個js文件,命名server.js(自定義名稱),內容如下 var http = require(‘http‘); var fs =

編寫一個函數在頁面輸出一個N行M列的表格表格內容填充1~100的隨機數字

order 編寫 表格 func 隨機 函數 var 隨機數 for 編寫一個函數,在頁面上輸出一個N行M列的表格,表格內容填充1~100的隨機數字 function tab(n,m){ document.write("<table border=1>"); f

Windows編寫的shell指令碼linux無法執行

  前兩天由於要查一個數據庫的binlog日誌,經常用命令寫比較麻煩,想著寫一個簡單的指令碼,自動去刷一下資料庫的binlog日誌,就直接在windows上面寫了,然後拷貝到linux中去執行,其實很簡單的指令碼,具體如下: #!/bin/bash #flush mysql logs every da

爬蟲教程」Python做一個簡單爬蟲小白也能看懂的教程

俗話說“巧婦難為無米之炊”,除了傳統的資料來源,如歷史年鑑,實驗資料等,很難有更為簡便快捷的方式獲得資料,在目前網際網路的飛速發展寫,大量的資料可以通過網頁直接採集,“網路爬蟲”應運而生,本篇將會講解簡單的網路爬蟲編寫方法。   開發環境 每個人的開發環境各異,下面上是我的開發

Python做一個簡單爬蟲小白也能看懂的教程

俗話說“巧婦難為無米之炊”,除了傳統的資料來源,如歷史年鑑,實驗資料等,很難有更為簡便快捷的方式獲得資料,在目前網際網路的飛速發展寫,大量的資料可以通過網頁直接採集,“網路爬蟲”應運而生,本篇將會講解簡單的網路爬蟲編寫方法。 開發環境 每個人的開發環境各異,下面上是我的開發環境,對於必須的

「爬蟲教程」Python做一個簡單爬蟲小白也能看懂的教程

俗話說“巧婦難為無米之炊”,除了傳統的資料來源,如歷史年鑑,實驗資料等,很難有更為簡便快捷的方式獲得資料,在目前網際網路的飛速發展寫,大量的資料可以通過網頁直接採集,“網路爬蟲”應運而生,本篇將會講解簡單的網路爬蟲編寫方法。   開發環境 每個人的開發環境各異,下面上是我的開發

輸入一個年月日日期給出一天和下一天的日期

要求輸入一個代表年月日的8位整數, 計算出其上一天和下一天是什麼日期 2月分閏年和平年 這裡用的是if-else分支結構分情況計算上一天和下一天的日期 public class Demo { public static void main(String[]

一個簡單案例5 分鐘看懂 Java Lamdba 表示式

JDK8引入了一個新玩意,叫做lamdba(那麼大)的表示式,說得神乎其神,說真的,這玩意吧,並不難,但是要講清楚吧,也不是太容易的事情。 從匿名內部類開始說起 老實交代,直接來講lamdba表示式還真是個枯燥的玩意,那從哪下手呢,我想你一定使用過匿名內部類吧,這玩意

如何寫一個簡單makefile

關於書寫簡單的makefile檔案,mark兩篇講解明白的部落格,看完至少可以寫出一個簡單的makefile檔案出來轉載地址:第一篇makefile 介紹make命令執行時,需要一個 makefile 檔案,以告訴make命令如何去編譯和連結程式。首先,我們用一個示例來說明m

一個簡單的猜數字遊戲(練習迴圈結構中的“while”)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>猜數字</title> <!--計算機隨機

介紹Hrorm:一個簡單宣告式的經過型別檢查的ORM

一個問題 關於將Java程式碼中的模型與關係(SQL)資料庫中的模型連線的問題,已經有很多網路墨水洩露了。物件關係對映(ORM)的主題確實很豐富,您可能想要在應用程式和資料庫之間傳輸資訊的全部內容都是巨大的。許多ORM工具試圖覆蓋儘可能多的空間; 他們的設計和實現提供了很大的靈活性,並

npm install —— 從一個簡單例子看本地安裝與全域性安裝的區別

npm的包安裝分為本地安裝(local)、全域性安裝(global)兩種,從敲的命令列來看,差別只是有沒有-g而已,比如 npm install grunt # 本地安裝 npm install -g grunt-cli # 全域性安裝 這兩種安裝方式有什麼區別呢?從

一個頁面上一塊區域顯示另一個頁面(或者檔案)的內容

按鈕的內容:<input name="butt" value="統計" type="button" id="change" onclick="change()" />給了一個onclick事件觸發js的程式碼。iframe框的內容:(注意,在這個div上還有一個父div!)<div clas

通過JSP實現:從網頁上上載一個文字檔案能顯示傳成功。之後點一個按鈕能在網頁顯示出該文字檔案的大小(位元組數)。

(1)在E:\apache-tomcat-8.0.52\webapps\ROOT目錄下建立dou.jsp和upload.jsp檔案: 兩個檔案的內容如下: dou.jsp <%@ page contentType="text/html; ch

集合70多種推薦演算法東北大學老師Java寫了一個開源庫在GitHub收穫近1500個Star...

 【AI科技大本營導讀】在經過一年多的開發工作之後,LibRec 3.0 版本終於釋出了。LibRec 是一個基於 Java 的開源演算法工具庫,覆蓋了 70 餘個各型別推薦演算法,可以有效解決評分預測和物品推薦兩大關鍵的推薦問題,目前已經在 GitHub 上收穫