當前位置:首頁 » 編程語言 » c語言makefile

c語言makefile

發布時間: 2023-06-09 14:07:51

① makefile 文件詳細介紹

makefile文件主要有以下五種組成部分。顯式規則:顯式規則說明了生成一個或多個目標文件的方法和步驟。這是在編寫makefile文件時明顯指出的,包括要生成的文件、生成文件的依賴文件以及生成的命令等。隱式規則:由於make工具有自動推導的功能,所以在編寫makefile文件的時候可以利用該規則,簡略地書寫makefile。再由 make 工具本身自動推導需要使用的規則。變數的定義: make工具支持變數的定義,這些變數往往都是字元串,因此makefile中的變數更像是c語言中的宏。當makefile被執行時,其中的變數都會被展開到相應的引用位置上。文件指示:其包括三個部分,一個是在一個makefile中引用另一個makefile,就像C語言中的include一樣。另一個是指根據某些情況指定makefile中的有效部分,就像C語言中的預編譯tlif一樣。還有就是定義一個多行的命令。注釋: makefile 中支持行注釋,這一點需要特別注意。makefile 中的注釋和 shell腳本一樣,其注釋是用「#」字元。如果需要在 makefile中使用「#」字元,可以用『\』對其進行轉義。例如,「\#」表示一個『#』字元。makefile文件的文件名最好命名為makefile或者Makefile。因為在默認的情況下,make命令會在當前目錄下按順序找尋這兩個文件進行解釋。用戶也可以為makefile文件自定義一個文件名,例如,Make.makefile,Make.admin等。

② 編寫一個簡單的 makefile 文件

makefile文件裡面主要有三種內容:


1.變數聲明:
變數聲明就是一種基本的嚴格字元替換的操作。
比如在前面聲明了:objects=program.o foo.o utils.o
那麼在後面出現的所有$(objects)或者${objects}都會被自動替換成上面的那個字元序列,而且是嚴格替換,即不帶空格的。

2.映射法則

3.命令:
映射法則和命令通常都是聯合起來組成這樣的結構形式:
target... : prerequisites..
command

可以簡單地理解為通過prerequisites,也就是先決的依賴文件,採取後面描述的相應的命令(這里的命令都是linux里的shell命令)command之後(一般是)生成了文件target。命令的前面都要按以下tab建留一段空白來表示它是命令。
有的target後面並沒有先決條件,也就是後面的命令是無條件執行的。

makefile 文件c語言程序:
#include <linux/init.h>
#include <linux/mole.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{

printk(KERN_ALERT "Goodbye, cruel world\n");
}

mole_init(hello_init);
mole_exit(hello_exit);

makefile:
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)

obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else

KERNELDIR ?= /lib/moles/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) moles

endif

③ linux中用C語言編寫完模塊後怎麼編寫makefile文件

1、先寫Makefile編譯出***.ko文件
模板如下,保存到命名為Makefile文件里,放到猛凱你代碼的同級目尺銷錄下
TARGET=my_proc.ko
LINUXDIR=/lib/moles/$(shell uname -r)/build
PWD=$(shell pwd)
obj-m :=
obj-m += my_proc.o

all: $(TARGET)
$(TARGET): $(OBJS)
make -C $(LINUXDIR) SUBDIRS=$(PWD) moles
clean:
rm -f moles.order Mole.symvers $(TARGET) *.mod.c *.o
rm -rf .tmp_versions .mod* Mole.markers
2、make
3、root許可權下用命令插入模塊
insmod my_proc.ko
4、可以用你寫的應用程序打開、操作模塊了
5、查看模塊命令
lsmod
cat /proc/moles
modinfo my_proc.ko
6、root下卸載模陵知游塊
rmmod

④ C語言Makefile調用其他makefile問題

方法有很多
最簡單的,就是在home的makefile裡面編譯一個目標時,執行操作加一句
make -C /home/temp
-C是切換到指定目錄去運行make,後面可以是絕對路徑,也可以是相對路徑

⑤ Makefile詳解

make 命令執行時,需要根據一些規則來決定按照怎麼樣的方式去 編譯和鏈接程序 ,這些規則就由 makefile 文件所指定。如果我們 makefile 文件寫的足夠好,make 命令會自動地根據當前的文件修改的情況來確定哪些文件需要重編譯,從而自己編譯所需要的文件和鏈接目標程序。

首先,本文將給出一個makefile文件的示例,以便大家能有一個直觀感受,這個例子來源於 GNU的make使用手冊 。在這個例子中,我們的工程有8個c文件,和3個頭文件,我們要寫一個makefile來告訴make命令如何編譯和鏈接這幾個文件。例子如下:

這個例子里 make 的編碼規則如下:

a. 如果這個工程沒有編譯過,那麼我們的所有c文件都要編譯並被鏈接。
b. 如果這個工程的某幾個c文件被修改,那麼我們只編譯被修改的c文件,並鏈接目標程序。
c. 如果這個工程的頭文件被改變了,那麼我們需要編譯引用了這幾個頭文件的c文件,並鏈接目標程序。

在詳細拆解上一節的 Makefile 之前,先來看下 Makefile 的基本範式。

target可以是一個 1) object file(可執行文件) ,2) 可執行文件 ,還可以是個3) label(標簽) ,關於標簽這個特性,在後面的 偽目標 章節還會有敘述。

prerequisites 就是,要生成那個target所需要的文件或是目標。 command 也就是 make 需要執行的命令,可以是任意的
shell 命令。

這是一個文件的依賴關系,也就是說,target 這一個或多個的目標文件依賴於 prerequisites 中的文件,其生成規則定義在 command 中。同時, prerequisites 中如果有一個以上的文件比target文件要新的話, command 所定義的命令就會被執行。這就是 Makefile 的規則,也是 Makefile 中 最核心 的內容。

有了這些規則後,再來分析上面的例子。在這個 makefile 中,目標文件(target)包含:

依賴文件(prerequisites)就是冒號後面的那些 .c 文件和 .h 文件。每一個 .o 文件都有一組依賴文件,而這些 .o 文件又是執行文件 edit 的依賴文件。

在定義好依賴關系後,後續的那一行定義了如何生成目標文件的系統命令, 一定要以一個tab鍵作為開頭 。 make 會比較
targets 文件和 prerequisites 文件的修改日期,如果 prerequisites 文件的日期要比targets文件的日期要新,或者 target 不存在的話,那麼,make就會執行後續定義的命令。

我們可以把這個內容保存在名字為 makefile 或 Makefile 的文件中,然後在該目錄下直接輸入命令 make 就可以生成可執行文件edit。如果要刪除執行文件和所有的中間目標文件,那麼,只要簡單地執行一下 make clean 就可以了。 註:反斜線()是換行符的意思,這樣比較便於閱讀。

這里要說明一點的是, clean 不是一個文件,它只不過是一個動作名字,有點像C語言中的 lable 一樣,其冒號後什麼也沒有,那麼,make就不會去找它的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令(不僅用於 clean,其他 lable 同樣適用),就要在 make 命令後顯式指出這個 lable 的名字。這樣的方法非常有用, 我們可以在一個 makefile 中定義不用的編譯或是和編譯無關的命令,比如程序的打包,程序的備份 ,等等。

在默認的方式下,也就是我們只輸入make命令。那麼,

這就是整個 make 的依賴性,make 會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文件。在找尋的過程中,如果出現錯誤,比如最後被依賴的文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,這些都不在 make 職責范圍內。

通過上述分析,我們知道,像 clean 這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,我們可以顯示要 make 執行。即命令 make clean ,以此來清除所有的目標文件,以便重編譯。

在上面的例子中可以看到,後綴為 .o 的一大串文件名寫了兩次,這樣比較費時費力,而且如果文件有所增減,要修改的地方也非常多,對以後的維護造成困難。在這種情形下,我們可以在Makefile里使用變數代替這一大串依賴文件,這里變數的使用方式基本類似於shell腳本里變數的使用方法。

我們可以在makefile一開始就這樣定義:

那麼接下來我們就可以很方便地在我們的Makefile中以 $(objects) 的方式來使用這個變數了,於是如果有新的 .o 文件加入,我們只需簡單地修改一下 objects 變數就可以了。

GNU 的 make 很強大,它可以自動推導文件以及文件依賴關系後面的命令,於是我們就沒必要去在每一個 .o 文件後都寫上類似的命令。因為,我們的make會自動識別,並自己推導命令。

只要make看到一個 .o 文件,它就會自動的把 .c 文件加在依賴關系中,如果make找到一個 FILENAME.o ,那麼 FILENAME.c ,就會是 FILENAME.o 的依賴文件。並且 cc -c FILENAME.c 也會被推導出來,於是,我們的makefile 再也不用寫得這么復雜。我們的新makefile就可以這么寫了。

這種方法,也就是make的**。上面文件內容中,「.PHONY」表示,clean是個偽目標文件。

⑥ c語言編譯運行出現Makefile.win已經改變,怎麼改

這個提示是說你當前項目里有多個文件里都有叫main的函數,這樣會導致系統不清楚從哪個main執行,建議你可以把其它文件里的main隨便改下下名字比如叫main1什麼的,只把你當前要運行的文件里的主函數改為main就行了。
或者建議如果只有一般的測試代碼只有一個文件的那種,新建的時候就不要建項目,直接建文件就可以了。

熱點內容
織夢通用源碼 發布:2025-02-13 21:48:41 瀏覽:438
pid演算法調速 發布:2025-02-13 21:20:31 瀏覽:686
腳本中new 發布:2025-02-13 21:00:11 瀏覽:741
什麼配置的筆記本電腦能玩神武 發布:2025-02-13 20:54:40 瀏覽:179
挑選雲伺服器需要注意什麼 發布:2025-02-13 20:53:31 瀏覽:98
加密滴膠卡 發布:2025-02-13 20:30:48 瀏覽:275
javalogin 發布:2025-02-13 20:25:48 瀏覽:427
智聯招聘無法上傳照片 發布:2025-02-13 20:16:03 瀏覽:529
python元素替換list 發布:2025-02-13 20:03:48 瀏覽:773
windows系統賬戶名和密碼是多少 發布:2025-02-13 20:03:02 瀏覽:531