Настройка автоинструментов для использования одинаковых объектных файлов для сборки двух программ - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть проект C ++, использующий для сборки autotools, и Catch2 для модульного тестирования. Детали Catch2, вероятно, не имеют отношения: это просто еще одна программа, которую я должен собрать и запустить.

У меня Makefile.am настроен так (упрощенно):

AUTOMAKE_OPTIONS = subdir-objects
check_PROGRAMS = catch2
bin_PROGRAMS = lpsdr

common_sources = applicationcontroller.cc flowgraph.cc [...]
lpsdr_SOURCES = $(common_sources) main.cc
catch2_SOURCES = $(common_sources) test.cc

Это работает в основном, за исключением того, что все компилируется дважды, создавая lpsdr-applicationcontroller.o и catch2-applicationcontroller.o и так далее для каждой вещи в common_sources.

Конечно, это удваивает время сборки. Я бы предпочел связать catch2 и lpsdr с одними и теми же объектными файлами: сборка будет быстрее, а также я буду проверять точно такой же скомпилированный код, как и на моем. Есть ли способ обойти это поведение?

1 Ответ

2 голосов
/ 13 апреля 2020

Я не знаю, есть ли способ избежать создания отдельных объектных файлов для каждой программы, но тот же эффект можно получить, создав промежуточную строку c библиотеку и затем связав lpsdr и catch2 против этого.

Примерно так:

AUTOMAKE_OPTIONS = subdir-objects

noinst_LIBRARIES = liblpsdr.a
check_PROGRAMS = catch2
bin_PROGRAMS = lpsdr

liblpsdr_a_SOURCES = applicationcontroller.cc dispatcher_sink.cc [...]

lpsdr_SOURCES = main.cc
lpsdr_LDADD = liblpsdr.a
catch2_SOURCES = test.cc
catch2_LDADD = liblpsdr.a
...