Ich baue eine gemeinsam genutzte Bibliothek und habe einen Quellbaum, der wie folgt strukturiert ist:
Makefile.am
src/
Makefile.am
srcfile1.h
srcfile1.cpp
...
thirdpaty/
Makefile.am
lib1/
Makefile.am
lib1.h
lib1.cpp
...
lib2/
...
Ich benutze rekursive Automake, da einige der Bibliotheken von Drittanbietern mit ihren eigenen Automake-Dateien verteilt werden. src/Makefile.am
enthält die üblichen Libtool-Makros:
lib_LTLIBRARIES = libmylib.la
libmylib_la_SOURCES = scrfile1.h srcfile1.cpp ...
Wie verknüpfe ich die Hauptbibliothek mit denen von Drittanbietern? Das Autotools Handbuch führt mich zu der Annahme, dass die Third-Party-Bibliotheken als Libtool-Convenience-Bibliotheken erstellt werden müssen, also habe ich folgendes: thirdparty/lib1/Makefile.am
:
noinst_LTLIBRARIES = libthirdpaty1.la
libthirdpaty1_la_SOURCES = lib1.cpp lib1.h
Und füge folgendes hinzu: src/Makefile.am
:
libmylib_la_LIBADD = $(top_buildir)/thirdparty/lib1/libthirdpaty1.la
Meine Wurzel Makefile.am enthält das Makro INCLUDES:
INCLUDES = -I$(top_builddir)/thirdparty
Aber das Bauen mit dieser Konfiguration gibt mir undefinierte Symbolfehler.
Was ist der richtige Weg, um diesen Quellcode zu strukturieren und alle Bibliotheken miteinander zu verknüpfen?
Antworten:
0 für die Antwort № 1Es stellt sich heraus, dass das Source-Layout und die Libtool-Verwendung in Ordnung waren, aber mein Root-Makefile.am hatte das folgende Makro:
SUBDIRS = src thirdparty
Was hätte sein sollen
SUBDIRS = thirdparty src
Seit dem Code in src/
referenzierte den Code in thirdparty/
, das thirdparty/
Code musste zuerst erstellt werden. Das SUBDIRS
Makro bewirkt, dass Unterordner in der angegebenen Reihenfolge von links nach rechts erstellt werden.