Makefile модуля ядра - Как сделать статическую библиотеку из объектов, а затем связать ее с другим объектом, чтобы сделать окончательный модуль - PullRequest
1 голос
/ 18 января 2012

У меня есть следующий 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 ...

А затем я изменяю make-файл на:

EXTRA_CFLAGS+=-DLINUX_DRIVER -mhard-float

obj-m += main.o libother.a

Поскольку я не владею Makefiles, мне интересно, знает ли кто-нибудь быстрое и чистое решение для этого.

Спасибо

Нуно

Ответы [ 3 ]

2 голосов
/ 19 января 2012

Я отвечу на свой вопрос.Я нашел в документации по 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 ...

Я надеваюНе знаю почему, но из-за предложенных ответов make-файл "забыл", что это был make-файл ядра, и все ядра, включенные в него, и определения дополнений в дополнительных флагах игнорировались.

Надеюсь, это поможет кому-то в будущем

С наилучшими пожеланиями,

Нуно Сантос

0 голосов
/ 18 января 2012

Вы можете сделать это следующим образом:

#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, тогда как libother.a будет переделываться всякий раз, когда изменяется любой из других objs

Обратите внимание, что библиотека связана с опцией -lother (как это обычно делается с библиотеками).Вам также нужно будет указать, что текущий каталог должен быть включен в путь поиска библиотеки с помощью -L.

0 голосов
/ 18 января 2012

Добавьте это правило к вашему Makefile:

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