我有一个内核模块的以下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,我想知道是否有人知道一个快速而干净的解决方案。
谢谢,
努诺
答案 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.