Так почему большинство проектов используют ***_LDFLAGS
***_LIBADD
в своих файлах Makefile.am при создании таких архивов (статическая библиотека "lib * .a")?
Система сборки GNU способна создавать динамические и статические библиотеки (или оба), определенные во время configure
с использованием флагов --enable-shared
и --enable-static
.Как вы уже догадались, _LDFLAGS
и _LIBADD
больше ориентированы на динамические общие объекты или программную связь, чем на статический компоновщик.Статический компоновщик libtool
- это, по сути, еще один проход ссылок, который вызывает ar
для создания архива (без учета всех флагов).Например:
lib_LTLIBRARIES=libfoo.la
libfoo_la_SOURCES=$(SRCS)
libfoo_la_LDFLAGS=-Wl,-t
, когда генерируются как общие, так и статические библиотеки, выводит что-то вроде:
libtool: link: gcc -shared -fPIC -DPIC .libs/foo.o -g -O2 -Wl,-t -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
...
libtool: link: (cd ".libs" && rm -f "libfoo.so.0" && ln -s "libfoo.so.0.0.0" "libfoo.so.0")
libtool: link: (cd ".libs" && rm -f "libfoo.so" && ln -s "libfoo.so.0.0.0" "libfoo.so")
libtool: link: ar cru .libs/libfoo.a foo.o
libtool: link: ranlib .libs/libfoo.a
libtool: link: ( cd ".libs" && rm -f "libfoo.la" && ln -s "../libfoo.la" "libfoo.la" )
automake
игнорирует _LDFLAGS
;однако скрипт, который выполняет связывание (libtool
), не выполняет.Он также ищет флаги, которые влияют на линковку.Например:
lib_LTLIBRARIES=libfoo.la
libfoo_la_SOURCES=$(SRCS)
libfoo_la_LDFLAGS=-Wl,-t -static
будет только генерировать статическую библиотеку, даже если для генерации Makefile был запущен configure --disable-static
.
libtool
- просто оболочкаСкрипт поверх встроенных инструментов компилятора / компоновщика для переносимости.