Buduję bibliotekę współdzieloną i mam strukturę drzewa źródłowego w następujący sposób:
Makefile.am
src/
Makefile.am
srcfile1.h
srcfile1.cpp
...
thirdpaty/
Makefile.am
lib1/
Makefile.am
lib1.h
lib1.cpp
...
lib2/
...
Używam rekurencyjnego Automake, ponieważ niektóre biblioteki innych firm są dystrybuowane z własnymi plikami Automake. src/Makefile.am
zawiera zwykłe makra libtool:
lib_LTLIBRARIES = libmylib.la
libmylib_la_SOURCES = scrfile1.h srcfile1.cpp ...
Jak połączyć główną bibliotekę z biblioteką zewnętrzną? The Instrukcja obsługi narzędzi automatycznych prowadzi mnie do przekonania, że biblioteki innych firm muszą być zbudowane jako biblioteki wygody libtool, więc mam następujące thirdparty/lib1/Makefile.am
:
noinst_LTLIBRARIES = libthirdpaty1.la
libthirdpaty1_la_SOURCES = lib1.cpp lib1.h
I dodaj następującą src/Makefile.am
:
libmylib_la_LIBADD = $(top_buildir)/thirdparty/lib1/libthirdpaty1.la
Mój root Makefile.am zawiera makro INCLUDES:
INCLUDES = -I$(top_builddir)/thirdparty
Ale budowanie za pomocą tej konfiguracji daje mi niezdefiniowane błędy symboli.
Jaki jest właściwy sposób na strukturę tego kodu źródłowego i połączenie wszystkich bibliotek razem?
Odpowiedzi:
0 dla odpowiedzi № 1Okazuje się, że ten układ źródłowy i użycie libtool były w porządku, ale mój root Makefile.am miał następujące makro:
SUBDIRS = src thirdparty
Co powinno być
SUBDIRS = thirdparty src
Od czasu wprowadzenia kodu src/
odwołał się do kodu w thirdparty/
, thirdparty/
kod musiał zostać zbudowany najpierw. The SUBDIRS
Makro powoduje, że podfoldery są budowane w kolejności, w jakiej zostały określone, od lewej do prawej.