Ответ 1
Automake не может создавать объекты без явной цели (программы, библиотеки), которые будут использовать эти объекты. Одна из причин заключается в том, что параметры компиляции указаны для каждой цели. Если две цели, например. два двоичных файла используют один и тот же объект, но имеют разные параметры компиляции, один и тот же объект может быть скомпилирован дважды.
У вас есть три способа сделать то, что вы хотите, все они связаны с привязкой исходных файлов к какой-либо цели.
-
Не используйте
src/ctrnn/Makefile.am
, просто укажите ссылку на исходные файлы подкаталога со своегоsrc/Makefile.am
:bin_PROGRAMS = foo foo_SOURCES = main.c crtnn/network.cpp crtnn/neuron.cpp
Обратите внимание, что это построитnetwork.o
иneuron.o
в том же каталоге, что иmain.o
. Если вы хотите объекты в подкаталогах, используйтеAUTOMAKE_OPTIONS = subdir-objects
. -
Используйте библиотеку удобства. В
src/crtnn/Makefile.am
создайте библиотеку двух ваших объектов:noinst_LIBRARIES = libcrtnn.a libcrtnn_a_SOURCES = network.cpp neuron.cpp
и вsrc/Makefile.am
свяжите свой исполняемый файл с библиотекой:bin_PROGRAMS = foo foo_SOURCES = main.c foo_LDADD = crtnn/libcrtnn.a SUBDIRS = crtnn
Он называется "удобством", когда он не будет установлен (вы можете сказать из-за префиксаnoinst_
): он используется только во время сборки. И это статическая библиотека, поэтому результат будет таким же, как если бы вы заменилиcrtnn/libcrtnn.a
наcrtnn/network.o
иcrtn/neuro.o
при связыванииfoo
. -
Используйте библиотеку удобства Libtool. Это требует большей настройки, если вы уже не используете Libtool. Вы должны добавить вызов
LT_INIT
вconfigure.ac
и перезапуститьautoreconf
, чтобы установить файлы libtool. Затем вы можете обновитьsrc/crtnn/Makefile.am
, чтобы сделать библиотеку двух ваших объектов следующим образом:noinst_LTLIBRARIES = libcrtnn.la libcrtnn_la_SOURCES = network.cpp neuron.cpp
иsrc/Makefile.am
следующим образом:bin_PROGRAMS = foo foo_SOURCES = main.c foo_LDADD = crtnn/libcrtnn.la SUBDIRS = crtnn
В чем разница? вы можете спросить, почти нет. Одно из преимуществ использования библиотек-библиотек Libtool заключается в том, что они могут быть вложенными: библиотека Libtool может включать в себя еще одну библиотеку Libtool (это удобно, когда у вас есть глубокая иерархия исходного кода, и вы создаете библиотеку на каждом уровне). Кроме того, библиотеки удобства Libtool могут использоваться для создания общей библиотеки, если хотите. Невозможно создать статические библиотеки Automake.