導航:首頁 > 操作系統 > linuxmakefile編寫

linuxmakefile編寫

發布時間:2023-08-16 12:05:32

❶ 如何在linux下寫makefile

Make工具最主要也是最基本的功能就是通過makefile文件來描述源程序之間的相互關系並自動維護編譯工作。而makefile 文件需要按照某種語法進行編寫,文件中需要說明如何編譯各個源文件並連接生成可執行文件,並要求定義源文件之間的依賴關系。

make命令的選項與參數

然後就完了。

❷ linux內核模塊編譯-通過Makefile重命名.ko文件名和模塊名

假設模塊的源文件為hello.c,源碼如下:

使用該文件編譯內核模塊。
正常情況下,Makefile文件內容如下:

執行 make 命令,生成hello.ko文件。
執行 sudo insmod hello.ko 命令,安裝該模塊。
執行 lsmod 命令,查看安裝的模塊。就會看到第一行的就是hello模塊。

但是,如果想自定義模塊名稱為 xmole ,而不是默認的 hello ,如何實現呢?方法如下:
在Makefile中重命名obj-m並將obj-m的依賴關系設置為原始模塊(hello)
修改後的Makefile文件內容如下:

將obj-m設置為 xmole .o,並使 xmole .o依賴於 hello .o.
執行 make 命令後,生成 xmole .ko, 而不是 hello .ko,
安裝命令: sudo insmod xmole.ko
查看命令: lsmod ,就會看到被安裝名為 xmole 的模塊。

❸ linux下 一個項目(源文件位於多個文件夾或者子文件夾),怎麼編寫makefile文件滿意高分!

# Copyright (c) 2006 Unihz Technologies Co., LTD.
# Author: Raymond S. <[email protected]>

PROGRAM := write # 最後的可執行文件
SOURCES := $(wildcard *.cpp) #通配當前目錄下說有的.cpp文件
#SOURCES += $(wildcard src/*.cpp)
OBJS := $(patsubst %.cpp,%.o,$(SOURCES)) #把$(SOURCES)中的變數符合後綴是.cpp的全部替換成.o,

CC := gcc
#CFLAGS := -c -ggdb -Wall -DBUILD_TIME="\"`date`\"" -DDEBUG
CFLAGS :=
#INCLUDE := -I ../unihz -I ../config -I traffic_light
INCLUDE :=

#LIB := ../unihz/libunihz.a ../config/libconfig.a -lpthread
LIB := #庫文件

.PHONY: clean install

$(PROGRAM): $(OBJS)
$(CC) -o $@ $^ $(LIB)
%.o: %.cpp
$(CC) -c $^ $(CFLAGS) $(INCLUDE) # $@:當前規則的目的文件名, $<:依靠列表中的第 一個依靠文件,而 $^:整個依靠的列表(除掉了裡面所有重復的文件名)。

clean:
rm *.o src/*.o $(PROGRAM) -f

install: $(PROGRAM)
cp $(PROGRAM) ./bin/
拿這個去該改吧,比較通用的

❹ 在LINUX系統中編程序,makefile是怎麼生成的,是通過GCC或GDB編譯聯接生成的嗎

這位朋友我看是有點誤解了makefile的做用。makefile 是一個腳本,由他來控制編譯出的程序的版本。當你改寫了原文件後,通過makefile 來檢查依賴關系,來生成最終的文件。比如一個程序叫a 他的源碼叫a.c

a.c 又用到頭文件a.h ,a.h是1.h和2.h生成的

如果你改寫了1.h,通過編寫makefile文件。make時會調用makefile來依此按依賴關系生成最後的a

所以說編譯時程序並不知道生成a都用到什麼。怎麼可能自己生成呢。

makefile是要你自己編寫的,來告訴make來如何編譯。make工具就相當於一個腳本。

❺ 使用linux編程怎麼寫makefile

Makefile語法基礎
在Linux下,自動化編譯工具是通過make命令來完成的(一些工具廠商也提供了它們自己的make命令,如gmake等),make命令的基本格式如下:
make
[-f
makefile]
[label]
它可以通過-f參數指定輸入文件,當省略-f參數時,默認輸入文件名為Makefile,由於我們通常不用這個-f參數,往往就用默認的Makefile文件名。
Makefile是一個文本文件,它是基於一定的語法規則的,它的基本執行規則定義如下:
target
:
[prerequisites]
command
target
標簽,用於標志當前構建的規則,它也可以是文件。
prerequisites
依賴項,在構建該標簽的時候先執行的規則
command
make需要執行的命令。(任意的Shell命令)
注意:Makefile的target是頂格寫的,而Command需要加一個Tab鍵。我這里為了排版看起來舒服點,每一行都多加了一個Tab鍵,如果要使用本文的Makefile示例,請去掉各行的第一個Tab鍵,否則make的時候報錯。
例如,我們編寫一個簡單的Makefile:
clean:
@echo
"clean"
all:
@echo
"all"
當我們直接執行make命令的時候,輸出如下:
tianfang
>
make
clean
tianfang
>
make
all
all
tianfang
>
make
clean
clean
從中我們可以看到:默認情況下構建第一個標簽。可以通過在命令行參數中通過參數構建指定標簽。

❻ [Linux]編寫一個簡單的C語言程序,編寫Makefile文件。

八 環境變數
8.1 查看環境變數
$ env  顯示所有的環境變數設置
$ echo $ENV_VARIABLE  顯示指定環境變數的設置
例:
$ echo $PATH
/bin:/etc:/usr/bin:/tcb/bin

8.2 設定環境變數
$ ENV_VARIABLE=XXX;export ENV_VARIABLE
例:
$ PATH=$PATH:$INFORMIXDIR/bin;export PATH  將環境變數PATH設定為原PATH值+$INFORMIXDIR/bin

8.3 取消環境變數設置
$ unset $ENV_VARIABLE
例:
$ set GZJ=gzj;export GZJ  設置環境變數GZJ
$ echo $GZJ
gzj  顯示環境變數值
$ unset $GZJ  取消環境變數GZJ的設置
$ echo $GZJ
 已取消

一 makefile規則
makefile是一個make的規則描述腳本文件,包括四種類型行:目標行、命令行、宏定義行和make偽指令行(如「include」)。makefile文件中注釋以「#」開頭。當一行寫不下時,可以用續行符「\」轉入下一行。
1.1 目標行
目標行告訴make建立什麼。它由一個目標名表後面跟冒號「:」,再跟一個依賴性表組成。
例:
example: depfile deptarget
該目標行指出目標example與depfile和deptarget有依賴關系,如果depfile或deptarget有修改,則重新生成目標。
example1 example2 example3: deptarget1 deptarget2 depfile
該目標行指出目標名表中的example1、example2、example3這三個各自獨立的目標是用相同的依賴列表和規則生成的。
clean:
空的依賴列表說明目標clean沒有其他依賴關系。

目標行後續的以Tab 開始的行是指出目標的生成規則,該Tab字元不能以空格代替。例如:
example.o:example.c example.h
cc –c example.c
該例子指出目標example.o依賴於example.c和example.h。如果example.c或example.h其中之一改變了,就需要執行命令cc –c example.c重新生成目標example.o。
可以用文件名模式匹配來自動為目標生成依賴表,如:
prog: *.c

以下是一個簡單的makefile的例子:

圖 1 最簡單的makefile例
make使用makefile文件時,從第一個目標開始掃描。上例中的第一個目標為all,所以目標clean不會自動被執行,可以通過命令make clean來生成目標。

1.2 命令行
命令行用來定義生成目標的動作。
在目標行中分號「;」後面的文件都認為是一個命令,或者一行以Tab製表符開始的也是命令。
如在上面的makefile例中,第三行以Tab字元開始的cc命令即是一個命令行,說明要生成hello應執行的命令。也可以寫成:hello:hello.o;cc –c hello –L…
一般情況下,命令行的命令會在標准輸出中回顯出來,如對上面的makefile執行make時,標准輸出如下:
cc -c hello.c
cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o
cc -c hello1.c
cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o
如果不希望命令本身回顯,可在命令前加@字元,如在上例中不希望回顯cc –c hello.c和cc –c hello1.c,可修改makefile文件如下:

圖 2 抑制回顯的makefile例
對該makefile文件執行make時,標准輸出如下:
cc -o hello -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello.o
cc -o hello1 -L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11 hello1.o
可以看出,命令行前有@字元的不回顯。

1.3 宏定義行
在makefile中,可以使用宏定義減少用戶的輸入,例如上例中對hello和hello1的編譯選項均為「-L/usr/X11R6/lib -L/usr/lib -lXm -lXt -lX11」,此時可以用宏來代替,如:
圖 3 使用宏定義的makefile例
宏定義的基本語法是:
name=value
在定義宏時,次序不重要。宏不需要在使用前定義。如果一個宏定義多次,則使用最後一次的定義值。
可以使用「$」字元和「()」或「{}」來引用宏,例如:
cc –o hello.o $(CCFLAGS) hello.o
也可以將一個宏賦值給另一個宏,但這樣的定義不能循環嵌套,如:
A=value1
B=value2
C=$(A) $(B)等價於C=value1 value2

1.4 偽指令
makefile大部分由宏定義行、命令行和目標行組成。第四種類型是make偽指令行。make偽指令沒有標准化,不同的make可能支持不同的偽指令集,使得makefile有一定的不兼容性。如果要考慮移植性問題,則要避免使用make偽指令。但有一些偽指令,如include,由於使用比較多,很多不同make都提供該偽指令。
1.4.1 偽指令include
該偽指令類似C語言中的#include,它允許一次編寫常用的定義並包括它。include偽指令必須在一行中,第一個元素必須是include,並且跟一個要包含的文件名,如:
include default.mk

1.4.2 偽指令「#」
「#」字元也是make的偽指令,它指出「#」後面的文件是注釋,如:
PROGNAME=test # define macro
#don't modify this

二 後綴規則
2.1 雙後綴規則
在前面的makefile例中有許多重復內容,例如,生成hello和hello1的命令類似,生成hello.o和hello1.o的命令也類似,除了編譯或鏈接的文件不一樣外,其它均相同,這時,我們就可以使用後綴規則。首先看一個雙後綴的例子:
圖 4 使用雙後綴規則的makefile例
後綴規則使用特殊的目標名「.SUFFIXES」。
第一行中.SUFFIXES的依賴表為空,用來清除原有的後綴規則,因為.SUFFIXES可以在makefile中多次使用,每一次都將新的後綴規則加入以前的後綴規則中。
第二行中指定後綴規則為「.c .o」,即表示將所有的.c文件轉換為.o文件。
第三行指定將.c文件轉換成.o文件的方法。$(CC)為make的預定義宏,其默認值為cc,$<為特殊的宏,代替當前的源文件,即所有要編譯的.c文件。
第六行指定目標hello和hello1的生成方法。$@為特殊的宏,代替當前的目標名,即hello和hello1,[email protected]即為hello.o和hello1.o。

上例介紹的是雙後綴規則,即它包含兩個後綴,如.c.o,用來把一個C源文件編譯為目標文件。雙後綴規則描述如何由第一個後綴類型的文件生成第二個後綴類型的文件,例如:.c.o規則描述如何由.c文件生成.o文件。

2.2 單後綴規則
單後綴規則描述了怎樣由指定後綴的文件生成由它基名為名字的文件。例如使用單後綴規則.c,可以由hello.c和hello1.c生成hello和hello1文件。例如將前面的makefile改為:
圖 5 使用單後綴規則的makefile例
由於.c後綴規則為make標准後綴規則,make為其指定了相應的命令行,所以在makefile中可以不用再指定其目標生成的具體命令行。

下表是make提供的標准後綴規則。
表 1 make標准後綴規則
後綴規則 命令行
.c $(LINK.c) –o $@ $< $(LDLIBS)
.c.ln $(LINK.c) $(POUTPUT OPTPUT OPTION) –i $<
.c.o $(COMPILE.c) $(OUTPUT OPTION) $<
.c.a $(COMPILE.c) –o $% $<
$(AR) $(ARFLAGS) $@ $%
$(RM) $%

三 特殊目標
在後綴規則中使用了特殊目標.SUFFIXES,用來指定新增的後綴規則。make還提供了幾個特殊目標來設置make的行為,下面為一些特殊的目標:
 .IGNORE
make在執行命令行時,如果返回的是錯誤碼,make的預設動作是停止並退出。增加該目標後,make將忽略命令行返回的錯誤碼,並繼續執行後續的操作。

 .SILENT
前面已經介紹過,make在執行命令行時會回顯命令行內容,在命令行前增加「@」字元將抑制該命令行的回顯。
如果增加該目標,所有的命令行不再回顯,相當於在每個命令行前均增加了「@」字元。

 .PRECIOUS
當收到一個信號或從shell命令返回非零的錯誤碼時,make刪除它所有已建立的文件。但有些文件即使出了錯誤,用戶也不想讓make刪除,這些文件可以作為.PRECIOUS目標的參數。它可以在一個makefile中出現多次,每一次都累積文件列表。

 .SUFFIXES
它為makefile指定新的後綴規則,新的後綴規則作為.SUFFIXES的依賴表給出。.SUFFIXES可以在一個makefile中多次使用,每一次都將新的後綴規則加入以前的後綴規則中,如果.SUFFIXES的依賴表為空,則設置後綴規則表為空。

四 特殊的宏
為簡單使用規則,make提供了幾個特殊的宏:
 $@
整個當前目標名的值可以由宏「$@」來代替。

 $<
當前的源文件由「$<」來代替。例如,在前面的例子中用到了$(CC) –c $<,其中的「$<」是所有要編譯的.c文件。宏「$<」僅在後綴規則或.DEFAULT中有效。

 $*
當前目標的基名由宏「$*」來代替。例如目標的名字是hello.o,則基名就是除去了後綴.o的hello。

以上介紹的特殊宏使用了make自身的規則,用戶不可以改變。下表介紹了C中預定義的宏。
用途 宏 默認值
庫文檔匯編命令 AR ar
ARFLAGS rv
AS as
ASFLAGS
COMPILE.s $(AS) $(ASFLAGS) $(TARGET ARCH)
C編譯器命令 CC cc
CFLAGS
CPPFLAGS
COMPILE.c $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET ARCH) –c
LINK.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET ARCH)
鏈接編輯器命令 LD ld
LDFLAGS
rm命令 RM rm
後綴列表 SUFFIXES .o .c .c~ .s .s~ .S .S~ .ln .f .f~ .F .F~ .l .mod .mod~ .sym
.def .def~ .p .p~ .r .r~ .y .y~ .h .h~ .sh .sh~ .cps .cps~

五 makefile的應用
當調用make時,它在當前目錄下搜索文件名是「makefile」或「Makefile」的文件,並執行。
如果不想使用上述預設文件,可以使用命令行中的「-f」來指定文件,如將編寫的makefile命名為mklib,則指定為「make –f mklib」。

閱讀全文

與linuxmakefile編寫相關的資料

熱點內容
手機設置遠程定位伺服器地址 瀏覽:913
android模擬器裝apk 瀏覽:773
炒黃金app哪個好用 瀏覽:993
恐懼症app哪個最好用 瀏覽:288
億賽通加密軟體好用嗎 瀏覽:578
為什麼光遇排隊伺服器忙 瀏覽:826
哪個app能把手p瘦 瀏覽:253
java中的date類型 瀏覽:431
面向程序員的范疇論 瀏覽:57
如何查詢伺服器所有電腦名 瀏覽:902
shell命令jar 瀏覽:301
有什麼做手帳app 瀏覽:156
phpjquery源碼 瀏覽:886
大話西遊手游源碼 瀏覽:655
javaudp代碼 瀏覽:660
linuxu盤啟動win7 瀏覽:990
如何啟用交換機dhcp伺服器 瀏覽:237
三田汽車壓縮機好嗎 瀏覽:294
馬蜂窩app偏向什麼客戶 瀏覽:366
php簡單的登錄注冊 瀏覽:554