我想我的內核模塊與外部靜態庫鏈接,像這樣:鏈接內核模塊的靜態庫
obj-m += my_prog.o
my_prog-objs := some/path/lib.a
# all the standard targets...
對於一些reasone,上面的Makefile不編譯my_prog.c在全部,並且生成的模塊不包含其代碼。當然,如果我刪除my_prog-objs
行,則編譯my_prog.c
。
這種方法在Makefile中出現了什麼問題?
我想我的內核模塊與外部靜態庫鏈接,像這樣:鏈接內核模塊的靜態庫
obj-m += my_prog.o
my_prog-objs := some/path/lib.a
# all the standard targets...
對於一些reasone,上面的Makefile不編譯my_prog.c在全部,並且生成的模塊不包含其代碼。當然,如果我刪除my_prog-objs
行,則編譯my_prog.c
。
這種方法在Makefile中出現了什麼問題?
您正在覆蓋默認的my_prog-objs
,這只是my_prog.o
。相反,與庫替換的內容,將庫添加到默認:
my_prog-objs := my_prog.o some/path/lib.a
希望你不是想對一個普通的用戶態庫......不會在內核空間在所有的工作聯繫起來。
您必須創建一個合成名稱以及源文件和它的對象名稱。您不能直接使用my_prog.o
,因爲有來自源代碼的規則。下面是一個示例,
obj-m += full.o
full-src := my_prog.c
full-objs := $(full-src:.c=.o) lib.o # yes, make it an object.
只有某些特殊目錄支持庫。你的對象應該被命名爲lib.o_shipped
並放置在同一個目錄中。參見:item 11 under TODOnote。因此,您需要將外部庫作爲的本地版本提供給本地版本。你需要兩個目標文件;一個是你編譯的'C'代碼/驅動程序,另一個是與庫連接在一起。
說明:我很face;;它有一個TODO來記錄這個功能。
顯然,你只需要在'lib.o_shipped'中需要的對象。你可以從'lib.a'中創建它,方法是用'ar'提取所有對象,然後用'ld -r'做一個增量鏈接。至少這就是我認爲我所做的......如果有人有更好的方法,我在聽:) –
當您創建my_prog-objs
列表時,您告訴kbuild僅使用該列表中的對象文件。 kbuild將不再編譯my_prog.c
,並且包含my_prog.o
的my_prog-objs
會導致循環依賴。相反,您需要創建一個唯一的obj-m
,並在其objs
列表中包含my_prog.o
和/path/lib.a
。例如:
obj-m += foo.o
foo-objs += my_prog.o /path/lib.a
花了我大約2個小時來弄清楚爲什麼我的模塊什麼都不做!
然後它抱怨'my_prog.o'的循環依賴並且無論如何跳過它。 –