LINUX.ORG.RU

вероятно простой вопрос о makefile


0

0

ну не понимаю я как этот makefile написать... обычно, он автоматически создавался... а сейчас надо ручками... помогите!
пишем библиотеку (.so) В библиотеке реализуем пару интерфейсов. Для каждого интерфейса отдельный файл (.cpp). Как написать правило, чтобы ВСЯ библиотека собиралась из нескольких исходников?
Имею следующее (выдернул из многочисленных примеров)
$(LIBRARY): $(LIBRSRC)
$(CC) -c $(CPPFLAG) -fPIC -shared $(LIBRSRC) -o $@
это мордорское заклятие работает только если LIBSRC это один (!!!) исходник. А если два, то фик! А надо!!! КАК???

anonymous

Надо было смотреть больше примеров, и выбирать более разнообразные примеры.

Например, в данном случае (предполагая неавтоматическое создание makefile'а) могу предположить (просто лично я этим никогда не занимался) следующее:

В начала makefile'а вставить строку:

LIBRSRC = source_1.cpp source_2.cpp

Список можно продолжить через пробел.

Для сложных проектов такой способ создания makefile'ов слишком трудоемкий, но для начала, в небольшом проекте вполне подойдет.

Ikonta_521
()

спасибо Ikonta_521, но....

я и это пробовал (но не писал). Это была первая мысля - просто расширить список зависимостей. Только вот компилятор не разделяет моего энтузиазма и сообщает:
gcc -c -Wall -g -fPIC -shared lib.cpp lib_2.cpp -o lib_test.so
gcc: cannot specify -o with -c and multiple compilations

обычный исполняемый бинарик собрать - нет проблем: делаем .о из всех .cpp и линкуем все объектные файлы в главную цель. И примеры все расчитаны на то, что собирается испольняемый модуль... ну неужели никто ручками больше не пишет!?


anonymous
()

LIBRSRC=\
 src1.cpp\
 src2.cpp\
 src3.cpp

$(LIBRARY): $(LIBRSRC) 
$(CC) $(CPPFLAG) -fPIC -shared $(LIBRSRC) -o $@ 

Должно проканать, НО - через задницу. Такой мейкфайл просто не нужен,
ибо он на каждый чих все перелопачивает.. Я б сделал так:


LIBRSRC=\
 src1.cpp\
 src2.cpp\
 src3.cpp

OBJECTS=\
 src1.o\
 src2.o\
 src3.o

LD=ld

... прочие определения

LIBS= -l... -l... -l... .... -- тута либы
LIBPATHS= -L... -L... -L... ... -- тута нестандартные пути к либам

$(LIBRARY): $(OBJECTS)
	$(LD) -shared -o $@ $(OBJECTS) $(LIBPATHS) $(LIBS)

.cpp.o:
	$(CC) $(CPPFLAGS) -fPIC -c  $<

И зависимости объектников от хидеров (man makedepend)
src1.o: src11.h src12.h src13.h ...
src2.o: src21.h src22.h src23.h ...
src3.o: src31.h src32.h src33.h ...

Для автоматизации последней секции можно так:
dep: $(LIBSRC)
	makedepend $(LIBSRC)

и прогнать сначала make dep

Типа того, я все это не проверял, не ручаюсь, что нигде не прогнал.

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous

2anonymous (*) (2003-02-26 15:44:52.27):
Тебе же простым английским языком пишут - убери на хрен "-c" !


Die-Hard ★★★★★
()

Будь проще

Не описывай несуществующих зависимостей - библиотека зависит от обьектных файлов - что-то типа
lib.so: $(OBJFILES)
$(LD) $(LDFLAGS) -shared -o $@ $(OBJFILES)

Остальное make сделает за тебя - он знает, как получить .o из .c,.cc,еще нескольких языков.
Если нужно что-нибудь необычное - смотри info make.

DonkeyHot ★★★★★
()

Почитай документашку про make, потратишь денек, другой, понемногу въедешь. Правда "make неисчерпаем как атом" :) Насчет нескольких исходников - посмотри шаблонные функции в gmake

PETER ★★
()

Спасибо всем! Заработало! С меня пиво... ^)

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