我正在尝试将我的内核模块与外部静态库链接,如下所示:
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中使用这种方法有什么问题?
答案 0 :(得分:2)
创建my_prog-objs
列表时,告诉kbuild只使用该列表中的目标文件。 kbuild将不再编译my_prog.c
,并且在my_prog.o
中包含my_prog-objs
会导致循环依赖。相反,您需要创建一个唯一的obj-m
,并在其my_prog.o
列表中包含/path/lib.a
和objs
。例如:
obj-m += foo.o
foo-objs += my_prog.o /path/lib.a
我花了大约2个小时来弄清楚为什么我的模块什么也没做!
答案 1 :(得分:1)
您将覆盖默认my_prog-objs
,这只是my_prog.o
。不是用库替换内容,而是将库添加到默认值:
my_prog-objs := my_prog.o some/path/lib.a
希望您不要尝试链接到一般用户空间库......在内核空间中根本不起作用。
答案 2 :(得分:1)
您必须创建合成名称以及源文件及其对象名称。您无法直接使用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 TODO note 。因此,您需要使用外部库并将其作为随附的版本在本地提供。你需要两个目标文件;一个是你编译的'C'代码/驱动程序,另一个是它与库链接在一起。
注意:我很滑稽;它有一个TODO来记录这个功能。