2010-02-16 8 views
12

У меня есть Makefile.am, который будет отвечать за создание окончательного применения бинарного:Как указать в скрипте Makefile.am, что я хочу только компилировать файлы .o., Которые могут быть позже связаны с?

проекта/SRC/Makefile.am

также в каталоге Src является подкаталог называется ctrnn, который содержит еще Makefile.am:

проекта/SRC/ctrnn/Makefile.am

Теперь ctrnn/Makefile.am должен только генерировать объект .o файлы с идея в том, что верхний уровень Makefile.am должен использовать объектные файлы, сгенерированные в подкаталоге ctrnn для создания двоичного файла.

Это ctrnn/Makefile.am

SOURCES = network.cpp\ 
    neuron.cpp 

AM_CPPFLAGS= @[email protected] 

На основе этого файла Makefile.am, я хочу закончить с network.o и neuron.o. Я генерации по Makefile с использованием Automake и т.д., но когда я пытаюсь и затем выполнить файл грим, он не делает ничего, и просто говорит:

делают: Ничто не должно быть сделано для `всех»

I знаете, почему это так, мне нужно указать цель сборки. Но как это сделать в скрипте ctrnn/Makefile.am, учитывая, что я не хочу создавать двоичный файл, который потребует bin_PROGRAMS, но фактические объектные файлы network.o и neuron.o?

(Обратите внимание, что если я укажу имя bin_PROGRAMS, он по праву заканчивает жалобу на неопределенную ссылку на главную).

Что я делаю неправильно?

Thanks, Ben.

ответ

25

Automake не может создавать объекты без явной цели (программы, библиотеки), которые будут использовать эти объекты. Одна из причин заключается в том, что параметры компиляции указаны для каждой цели. Если две цели, например. два двоичных файла используют один и тот же объект, но имеют разные параметры компиляции, один и тот же объект может быть скомпилирован дважды.

У вас есть три способа сделать то, что вы хотите, все они связаны с привязкой исходных файлов к какой-либо цели.

  1. Не используйте 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.

  2. Используйте библиотеку удобства. В 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.

  3. Используйте библиотеку удобства 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 не могут.

+1

Спасибо! Я закончил с использованием метода libtool, отлично работает :-) –

+2

Спасибо за руку помощи за то, что я стремлюсь к амуту autotools/libtool. И сделайте нам все одолжение: живите долго и процветайте! – rockdaboot

+0

foo_LDADD? Это не должно быть foo_LIBADD –

2

Вы можете просто указать исходные файлы проекта/SRC/Makefile.am и не имеют Makefile.am в ctrnn:

 
maude_SOURCES = ctrnn/network.cpp ctrnn/neuron.cpp 

или вы можете использовать библиотеку удобства Libtool. В ctrnn/Makefile.am, говоря:

 
noinst_LTLIBRARIES = libctrnn.la 
libctrnn_la_SOURCES = network.cpp neuron.cpp 

и в ИПВ/Makefile.am, положить

 
LDADD = ctrnn/libmylib.la 

Если вы не используете Libtool, вам также необходимо добавить LT_INIT к configure.ac.

0

еще лучше, вы могли бы ЗАСТАВИТЬ грим с помощью источника менее цель, делая это:

SUBDIRS = sub1 sub2 … 
lib_LTLIBRARIES = libtop.la 
libtop_la_SOURCES = 
# Dummy C++ source to cause C++ linking. 
nodist_EXTRA_libtop_la_SOURCES = dummy.cxx 
libtop_la_LIBADD = \ 
    sub1/libsub1.la \ 
    sub2/libsub2.la \ 
... 

Секрет Соус является nodist_EXTRA_xxxx_la_SOURCES.

Подробнее: https://www.gnu.org/software/automake/manual/html_node/Libtool-Convenience-Libraries.html