内核模块makefile - 如何从对象创建静态库,然后与另一个对象链接以生成最终模块

时间:2012-01-18 16:08:41

标签: static makefile kernel

我有一个内核模块的以下Makefile:

EXTRA_CFLAGS+=-DLINUX_DRIVER -mhard-float

obj-m += main.o
other-objs := Obj.o Obj1.o Obj2.o Obj2.o ... 

问题:

我如何首先从所有对象创建静态库,然后使用创建的静态库与主对象链接?

我知道如何通过两个步骤手动完成此过程。首先我打电话给上面的版本。然后我打电话给:

ar rcs libother.a Obj.o Obj1.o ...

然后我将makefile更改为:

EXTRA_CFLAGS+=-DLINUX_DRIVER -mhard-float

obj-m += main.o libother.a

由于我没有掌握Makefile,我想知道是否有人知道一个快速而干净的解决方案。

谢谢,

努诺

3 个答案:

答案 0 :(得分:2)

我会回答我自己的问题。我在Kernel Makefile文档中找到了以下内容:

--- 3.5库文件目标 - lib-y   使用obj- *列出的对象用于模块或   结合在特定目录的内置.o中。   还可以列出将要的对象   被包含在库lib.a中。   使用lib-y列出的所有对象都合并为一个对象   该目录的库。

所以,我所做的是将make文件更改为:

EXTRA_CFLAGS+=-DLINUX_DRIVER -mhard-float

obj-m += main.o lib.a
lib-y := Obj.o Obj1.o Obj2.o Obj2.o ...

我不知道为什么,但建议的答案是使makefile“忘记”它是一个内核makefile并且所有内核包含和额外标志中的添加定义被忽略。

希望将来帮助某人,

致以最诚挚的问候,

Nuno Santos

答案 1 :(得分:0)

将此规则添加到Makefile

libother.a: $(other-objs)
    ar cr $@ $<

答案 2 :(得分:0)

你可以这样做:

#your variable definitions here

all: your_module_name

your_module_name: main.o libother.a
    gcc $(YOUR_OPTIONS_HERE) -o your_module_name main.o -L. -lother

libother.a: $(other-objs)
    ar rcs $@ $^

main.o: main.c 

#your .o file dependencies here, if needed

.PHONY: all

这样你的模块将依赖于main.o和libother.a,而当任何其他objs被更改时,libother.a将被重新创建

请注意,库是通过-lother选项链接的(因为它通常用库完成)。您还需要指定当前目录应包含在-L.

的库搜索路径中
相关问题