Лучший способ компилировать подкаталоги в библиотеки с automake? - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующие файлы

├── configure.ac
├── main.cpp
├── Makefile.am
└── procs
    ├── Makefile.am
    ├── proc1
    │   └── subprocs
    │       ├── subprocA
    │       │   ├── ProcA_SubprocA.cc
    │       │   └── ProcA_SubprocA.h
    │       └── subprocB
    │           ├── ProcA_SubprocB.cc
    │           └── ProcA_SubprocB.h
    ├── proc2
    │   └── subprocs
    │       ├── subprocA
    │       │   ├── ProcB_SubprocA.cc
    │       │   └── ProcB_SubprocA.h
    │       └── subprocB
    │           ├── ProcB_SubprocB.cc
    │           └── ProcB_SubprocB.h
    └── Subprocs.h

Моя цель - создать библиотеку из всего в procs , чтобы ее можно было использовать в main.cpp , котораяможет выглядеть примерно так:

main.cpp

#include "Subprocs.h"

int main(){

    ProcA_SubprocA * p = new ProcA_SubprocA();
    p->use();
    delete p;

    return 0;
}

Я хотел бы иметь все включения подпроцессов в Subprocs.h , так что это может бытьиспользуется как некоторый интерфейс:

Subprocs.h

#include "ProcA_SubprocA.h"
#include "ProcA_SubprocB.h"
#include "ProcB_SubprocA.h"
#include "ProcB_SubprocB.h"

My configure.ac выглядит так:

configure.ac

AC_PREREQ([2.69])
AC_INIT([main], [0.1])
AM_INIT_AUTOMAKE([foreign subdir-objects])

#AC_CONFIG_MACRO_DIR([m4]) 
#LT_INIT

AC_PROG_CXX
AC_PROG_CC
AC_PROG_RANLIB

AC_CONFIG_FILES([Makefile procs/Makefile])
AC_OUTPUT

и мои Makefile.am вот так

Makefile.am

SUBDIRS = procs

AM_CPPFLAGS = -Iprocs

bin_PROGRAMS = main
main_SOURCES = main.cpp
#added:
main_LDADD = procs/libprocs.a

#ACLOCAL_AMFLAGS = -I m4

procs / Makefile.am

AM_CPPFLAGS = -Iproc1/subprocs/subprocA -Iproc1/subprocs/subprocB \
              -Iproc2/subprocs/subprocA -Iproc2/subprocs/subprocB

#lib_LIBRARIES = libprocs.la
noinst_LIBRARIES = libprocs.a
libprocs_a_SOURCES = Subprocs.h \
                      proc1/subprocs/subprocA/ProcA_SubprocA.cc proc1/subprocs/subprocA/ProcA_SubprocA.h \
                      proc1/subprocs/subprocB/ProcA_SubprocB.cc proc1/subprocs/subprocB/ProcA_SubprocB.h \
                      proc2/subprocs/subprocA/ProcB_SubprocA.cc proc2/subprocs/subprocA/ProcB_SubprocA.h \
                      proc2/subprocs/subprocB/ProcB_SubprocB.cc proc2/subprocs/subprocB/ProcB_SubprocB.h

Когда я набираю

#libtoolize && autoreconf -i -f && ./configure && make
autoreconf -i -f && ./configure && make

, я получаю файл с именем libprocs.la в procs , но я не получаю двоичный файл.Я также вполне уверен, что мои Make-файлы неверны, так как я даже не могу скомпилировать main.cpp вручную.

Можно ли вообще делать то, что я хочу здесь?Или я обдумываю это, и мне вообще не нужна библиотека?Для меня важная часть заключается в том, что main.cpp включает только Subprocs.h , который затем содержит все включения подпрограмм.

Заранее спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Существует множество странностей в том, что вы представили, и одна явная ошибка.Вы говорите:

Я получаю файл с именем libprocs.la в процессах, но я не получаю двоичный файл.Я также вполне уверен, что мои Make-файлы неверны, так как я даже не могу скомпилировать main.cpp вручную.

Конечно, make вывод содержит одно или несколько сообщений об ошибках, которые объясняют, почему сборкавыходит из строя.Я полагаю, что если бы вы make не использовали только подкаталог procs, в этом случае конечно вы бы не получили main встроенный.

Но я 'Я достаточно уверен, что могу догадаться: вы получаете ошибку компоновщика с жалобой на то, что он не может найти ProcA_SubprocA::ProcA_SubprocA.Это может быть потому, что, хотя ваш Makefile указывает, что библиотека должна быть встроена (и также установлена), он нигде не говорит, что ее нужно связать с main.Для этого есть довольно простое решение, к которому я вернусь через минуту.

Сначала давайте поговорим о libprocs.la.Суффикс .la имеет смысл для Autotools, обозначая «архив libtool», но вы фактически создаете его как обычную статическую библиотеку.На самом деле libtool здесь не делает ничего особенно полезного для вас;Я бы сбросил его, удалив LT_INIT из вашего configure.ac (и больше не запускать libtoolize, так как он вернет это обратно).Затем измените имя библиотеки для сборки на более стандартную libprocs.a.

Кроме того, поскольку эта библиотека, по-видимому, предназначена только для использования с одной создаваемой программой, включать ее бесполезнов установке самостоятельно.Поэтому вместо того, чтобы обозначать его в lib_LIBRARIES, назначьте его как неустановленную вспомогательную библиотеку:

noinst_LIBRARIES = libprocs.a

Затем вам потребуется внести соответствующее изменение в переменную SOURCES библиотеки:

libprocs_la_SOURCES = ...

libprocs_a_SOURCES = ...

Возвращаясь к основной программе сейчас, вы должны сказать make (иAutomake), что библиотека должна быть связана с программой main.Есть несколько вариантов того, как вы могли бы это сделать, но я собираюсь предложить довольно простой:

main_LDADD = procs/libprocs.a

После этих изменений повторите autoreconf (но не libtoolize).Помните, однако, что вам нужно запускать это только после изменения источников Autotools - только файлы Makefile.am и configure.ac в вашем случае.Это деталь поддержки и развития пакета и его системы сборки в частности.Это не должно быть обычной частью сборки или установки пакета.

...