我想我的内核模块与外部静态库链接,像这样:链接内核模块的静态库
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'的循环依赖并且无论如何跳过它。 –