autotools: один проект с одним исполняемым файлом, одним общим объектом и общей внутренней библиотекой

Пробую свои силы в автоинструментах. У меня следующая иерархия проектов:

    project/src
    project/src/utilities
    project/src/utilities/util.c
    project/src/utilities/util.h
    project/src/sharedObject
    project/src/sharedObject/sharedObject.c
    project/src/sharedObject/sharedObject.h
    project/src/sharedObject/thing.c
    project/src/executable
    project/src/executable/exec.c
    project/src/executable/exec.h
    project/src/executable/thing1.c
    project/src/executable/thing2.c

"executable" и "sharedObject.so" оба зависят от "util.o" и "util.h". Я видел примеры создания вспомогательных библиотек, но я не уверен, как указать их в "Makefile.am" файлах в двух других подпроектах. Как определяются эти виды межпроектных зависимостей?

Будут установлены как "executable", так и "sharedObject.so". Файлы "util.o" и "util.h" будут использоваться только в процессе сборки.

Спасибо


person 7 Reeds    schedule 15.04.2013    source источник
comment
Прежде чем углубляться в автоинструменты, рекомендую взглянуть на CMake. Я считаю, что с ним намного проще работать, чем с автоинструментами. Однако, если вы делаете программное обеспечение с открытым исходным кодом в традиционном стиле, то ожидаются автоинструменты.   -  person Randall Cook    schedule 16.04.2013


Ответы (1)


В utilities/Makefile.am:

noinst_LTLIBRARIES = libutil.la   
libutil_la_SOURCES = util.h util.c

В executable/Makefile.am при использовании библиотеки следует использовать первичный LDADD, например,

bin_PROGRAMS = exec
exec_SOURCES = exec.h exec.c thing.h thing.c
exec_LDADD = ../utilities/libutil.la

В sharedObject/Makefile.am используйте первичный LIBADD:

lib_LTLIBRARIES = sharedObject.la
sharedObject_la_SOURCES = sharedObject.h sharedObject.c thing.c
sharedObject_la_LIBADD = ../utilities/libutil.la

Если вы действительно хотите, чтобы sharedObject.so загружался динамически, вам также понадобятся:

sharedObject_la_LDFLAGS = -module

В противном случае цель должна называться libsharedObject.


Makefile.am верхнего уровня должен упорядочить SUBDIRS, чтобы зависимость строится первым:

SUBDIRS = utilities executable sharedObject

person Brett Hale    schedule 16.04.2013
comment
Спасибо, Бретт, я попробую это утром! - person 7 Reeds; 16.04.2013