LINUX.ORG.RU

Линковка статической библиотеки

 


0

2

Здравствуйте.
Представим, что у нас есть десяток объектыных .o файлов, задача - запихнуть всё в .a архив. Возможно ли это сделать используя неявные правила-шаблоны (возможно самодельные)? Прописать вручную $(AR) -r в каждом правиле создающем архив - не вариант (также не вариант макрос, типа $(LINK)). Т.е. получить что-то типа libmy.a: $(obj), не задавая каждый раз рецепта. Я документацию про make архивы читал, но как-то мутно там, примеров нет. Пробовал всякие вариации libmy.a($(obj)). Хотелось бы грамотный пример.

ЗЫ: только без требования, что имя архива == имени объектного файла.

★★

Последнее исправление: pavlick (всего исправлений: 2)

Если я правильно понял, нужно несколько .o файлов запихнуть в .a. Тогда можно использовать glob. Пример Makefile:

create-a: *.o
	@echo Call ar here with $^

ProtoH
()

Если тебе все обьекты туда нужны, ты и не сможешь задать рецепт каждый раз. Он будет один вида ar rcs $@ $^

arturpub ★★
()

Ну вот допустим, что мы пишем makefile

all: libm.a libq.a

libm.a: 5.c

libq.a: 6.c

%.a: .c     # МЕТКА
        @echo $+

Можно ли наисать правило #МЕТКА таким образом, чтобы мы получили одно echo == 5.c, а другое 6.c ? %.a: %.c не сгодится, %.a: *.c что-не то делает, как ещё пробовать не знаю. Вообще пишу один универсальный make файл для любых проектов, хочу избежать написания рецептов, нужен исполняемый файл - пишу exec_name: $(objects), стат библиотека libm.a: $(object). И чтобы всё выводилось через неявный правила.

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

Может все-таки сначала скомпилить объектники ? А потом как сказали выше заюзать правило с $^

CC=$(CROSS_COMPILE)gcc
CFLAGS+=-I. -O3
DEPS=
OBJ=s1.o s2.o

%.o: %.c $(DEPS)
	$(CC) $(CFLAGS) -c -o $@ $<

%.a: $(OBJS)
	ar rcs $@ $^

libtest.a: $(OBJ)
$ make
gcc -I. -O3 -c -o s1.o s1.c
gcc -I. -O3 -c -o s2.o s2.c
ar rcs libtest.a s1.o s2.o
$ ar t libtest.a 
s1.o
s2.o
alx777 ★★
()

Разобрался, если писать правило для стат либы руками, то выглядит так:

(%.o): %.o
       @echo $^
       $(AR) -rc $@ $^
Но это и не нужно, у make есть встроенное неявное правило. Для создания стат либы через неявное правило нужно писать:
libm.a: libm.a($(objects))

А весь Makefile у меня такой получился:

SRCDIR::=../
#override ARFLAGS+=
#override ASFLAGS+=
override CXXFLAGS+=-std=c++14 -Wall -Wextra -Werror -Wfatal-errors
#override CPPFLAGS+=
#override LDFLAGS+=
#override LDLIBS+=

sources::=$(notdir $(wildcard $(SRCDIR)/*.cpp))
objects::=$(sources:.cpp=.o)
deps::=$(sources:.cpp=.d)
VPATH::=$(SRCDIR)
CC::=$(CXX)

#-------------------------------------------------{
libm.a: libm.a($(objects))  # линкуем стат либу

exec: $(objects)    # среди $(objects) должен быть cpp с именем цели, т.е exec.cpp
#-------------------------------------------------}

%.d: %.cpp
        @set -e; rm -f $@; \
        $(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \
        sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
        rm -f $@.$$$$
include $(deps)

pavlick ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.