Linux Unix下makefile檔案編寫例項

2021-06-21 14:59:22 字數 3267 閱讀 5304

最近做linux

**移植,剛剛學習了下

makefile

檔案的編寫,現將心得與大家分享。

一、makefile

的規則在講述這個makefile

之前,還是讓我們先來粗略地看一看

makefile

的規則。

target ... : prerequisites ...

command

......

target也就是乙個目標檔案,可以是

object file

,也可以是執行檔案。還可以是乙個標籤

(label

),對於標籤這種特性,在後續的「偽目標」章節中會有敘述。

prerequisites就是,要生成那個

target

所需要的檔案或是目標。

command也就是

make

需要執行的命令。(任意的

shell

命令)這是乙個檔案的依賴關係,也就是說,

target這乙個或多個的目標檔案依賴於

prerequisi

tes中的檔案,其生成規則定義在

command

中。說白一點就是說,

prerequisites

中如果有一

個以上的檔案比target

檔案要新的話,

command

所定義的命令就會被執行。這就是 

makefi

le的規則。也就是

makefile

中最核心的內容。

1.1 動態庫例項

**存放路徑為:dext/include 

和dext/src 

分別存放標頭檔案和實現檔案。

makefile

檔案存放在

dext

目錄。cc=g++                                #編譯器

obj=$(dms_pub)/lib/libdext.so                    #動態庫生成目錄

objs= impdatamgr.o datamgr.o                    #動態庫依賴目標檔案

incpath=-i$(ace_root) -i$(tt_root)/include -i$(otl_root) -i$(oci_root)/include -i$(dms_pub)/include -i./include        #編譯依賴頭檔案目錄

libpath=-l$(ace_root)/lib -l$(tt_root)/lib -l$(oci_root)/lib -l$(dms_pub)/lib

libs=-lace -lttclasses -lociei -lzdevone

flags=-c -g -fpic

vpath=./src/#定義依賴檔案的搜尋路徑。該路徑只能在依賴檔案中使用,不可用於編譯到原始檔搜尋路徑。

src=./src/

$(obj):$(objs)

$(cc) -shared $(objs) -lc -o $(obj)  

impdatamgr.o:impdatamgr.cpp

$(cc) $(flags) $(incpath) $(src)impdatamgr.cpp

datamgr.o:datamgr.cpp

$(cc) $(flags) $(incpath) $(src)datamgr.cpp

clean:

rm -f *.o *.so

1.2 可執行程式例項

cc=g++                                #編譯器

obj=$(dms_root)/bin/ds                        #目標生成目錄

flags=-c -g

objs= datafileshandler.o datastorage.o dboperator.o heartbeatsender.o hostbakswitcher.o                    #目標依賴目標檔案

incpath=-i$(ace_root) -i$(otl_root) -i$(oci_root)/include -i$(dms_pub)/include -i./include        #編譯依賴頭檔案目錄

libpath=-l$(ace_root)/lib -l$(oci_root)/lib -l$(dms_pub)/lib

libs=-lace -lociei -lzdevone

vpath=./src/

src=./src/

$(obj):$(objs)

$(cc) -o $@ $^ $(libpath) $(libs) 

datafileshandler.o:datafileshandler.cpp

$(cc) $(incpath) $(flags) $(src)datafileshandler.cpp

datastorage.o:datastorage.cpp

$(cc) $(incpath) $(flags) $(src)datastorage.cpp

dboperator.o:dboperator.cpp

$(cc) $(incpath) $(flags) $(src)dboperator.cpp

heartbeatsender.o:heartbeatsender.cpp

$(cc) $(incpath) $(flags) $(src)heartbeatsender.cpp

hostbakswitcher.o:hostbakswitcher.cpp

$(cc) $(incpath) $(flags) $(src)hostbakswitcher.cpp

clean:

rm -f *.o

例項詳解

上面是生成乙個動態庫的makefile

檔案。其中用到了巨集定義,系統環境變數,引用第三方庫。下面進行詳細說明:

巨集定義:makefile

為了簡化檔案結果,支援巨集定義。如上面檔案中到cc、

lib、

obj等都是定義的巨集。如果巨集不超過乙個字元,可以直接使用,如

$c;如果超過乙個字元,需要用括號擴起來,如

$(lib)

。環境變數:在makefile

檔案裡面可以使用系統的環境變數,但是使用時,需要注意,必須用括號擴起來,如

$(dms_pub).

makefile檔案裡面不可以用空格。

目標所使用的編譯命令要用乙個tab

空格縮排。切忌要使用

tab鍵進行縮排!

Linux Unix下的命令擴充套件

linux系統中使用檔案屬性決定檔案可以怎麼使用 檔案的使用方式分為讀,寫,和執行 三種不同的使用者分別是所有者,同組人和其他人。每組屬性由三那個字母構成,分別代表讀寫和執行能力 r代表讀能力,每組屬性的第乙個 w代表寫能力,是每組屬性的第二個 x代表執行能力,是每組屬性的第三個 某個位置如果是 號...

linux unix下檢視oracle字符集

檢視資料庫版本 select from v version 包含版本資訊,核心版本資訊,位數資訊 32位或64位 等 至於位數資訊,在linux unix平台上,可以通過file檢視,如file oracle home bin oracle 1 查詢oracle server端的字符集 有很多種方法...

在Linux Unix下建立程序

不同的作業系統採用不同的實現方式來建立程序。例如在unix系統中,每個程序都有唯一的程序識別號 pid 父程序利用fork系統呼叫來建立新程序。fork的返回值小於零,說明程序沒有建立成功 fork的返回值等於零,表示子程序正在執行 fork的返回值大於零,表示父程序還在執行。子程序被建立後,一般使...