我正在嘗試構建一個非常簡單的內核模塊,但遇到了這個錯誤:
make -C /lib/modules/5.16.14-051614-generic/build M=/home/nanyo/Documents /ProgrammingEnvs/LinuxKernelDriver modules
make[1]: Entering directory '/usr/src/linux-headers-5.16.14-051614-generic'
make[2]: *** No rule to make target '/home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver/hi.o', needed by '/home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver/hi.mod'. Stop.
make[1]: *** [Makefile:1852: /home/nanyo/Documents/ProgrammingEnvs/LinuxKernelDriver] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.16.14-051614-generic'
make: *** [Makefile:4: all] Error 2
這是生成檔案:
obj-m = hi.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) clean
盡管堆疊溢位也有類似的錯誤,但沒有一個具體說no rule to target '.../name.o' needed by '.../name.mod'
我像這樣運行 make ~/Documents/ProgrammingEnvs/LinuxKernelDriver$ make。嘗試使用 sudo 從其他問題提出的任何解決方案并嘗試使用 CURDIR 和 PWD 都沒有幫助。
我在 Ubuntu 22.04 jammy 上運行,帶有 5.16.14 內核(我必須運行這個內核,因為舊的內核似乎不適用于我最近的硬體)
我已經嘗試編譯 15 行代碼 2 天了,求助!:)
uj5u.com熱心網友回復:
如果您要求make構建一個類似的目標檔案hi.o,它將尋找一個源檔案來構建目標檔案。它不會查找任何隨機源檔案(如果您有 20 個源檔案怎么辦?它應該如何確定您的意思是哪一個?),它將根據目標檔案的名稱查找源檔案。
所以如果你想把 C 代碼編譯成hi.o.make 會尋找一個名為hi.c. 如果你想將 C 代碼編譯成hi.o.make 將尋找一個源檔案,如hi.cpp. 如果要編譯 Fortran,make 會查找hi.f等。
請注意,Linux 系統與 Windows 和 MacOS 不同,使用區分大小寫的檔案名,因此hi.c、Hi.c、HI.c等都是不同的檔案,并且hi.o只會匹配第一個檔案。
如果 make 找不到與目標檔案名稱相關的源檔案,它不會說“好吧,這里只有一個源檔案,這一定是他們的意思”。這種任意行為在構建工具中是一件壞事:make 完全按照您的要求執行,如果不能,它不會嘗試猜測您的意思。它給你一個錯誤,比如沒有規則來制作目標 'hi.o'。
如果您出于某種原因想使用不同的物件和源名稱,您可以這樣做,但您必須通過撰寫自己的顯式規則來告訴 make:
hi.o : mycoolfile.c
<recipe to build hi.o from mycoolfile.c>
由于內核構建無法知道您可能選擇的源檔案名,因此您必須在自己的 makefile 中撰寫這些規則。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/449838.html
