Что означают флаги ссылок для статической библиотеки? - PullRequest
2 голосов
/ 07 мая 2019

«ar» - это просто инструмент для создания архивов.

И все статические библиотеки вида "lib * .a" на самом деле являются просто заархивированными скомпилированными объектами + дополнительный файл с таблицей символов, добавленный туда "ranlib". При создании такой библиотеки ссылки не выполняются.

Так почему большинство проектов используют ***_LDFLAGS ***_LIBADD в своих Makefile.am при создании таких (статическая библиотека "lib * .a") архивов?

игнорирует ли Autokeke эти флаги (в случае, когда они относятся к какой-либо статической библиотеке "lib * .a"), или это на самом деле что-то там связывает?

Ответы [ 2 ]

3 голосов
/ 08 мая 2019

Так почему большинство проектов используют ***_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 - просто оболочкаСкрипт поверх встроенных инструментов компилятора / компоновщика для переносимости.

1 голос
/ 07 мая 2019

Ответ на ваш вопрос Does automake ignore them: NO

Это совершенно верно: «" ar "- это просто инструмент для создания архивов".
Но Automake вообще не игнорирует ***_LDFLAGS ***_LIBADD в их Makefile.am, иначе какой смысл иметь такой флаг, если они не имеют никакого смысла для системы сборки!

Отдокументация (ссылка приведена ниже):

  • Переменная 'library_LIBADD' должна использоваться для перечисления дополнительных libtool объектов ( .lo файлов ) или libtool библиотеки ( .la ) для добавления в библиотеку.
  • Переменная 'library_LDFLAGS' - это место для списка дополнительных libtool флагов связи, например, -version-info, -static и многое другое.

Для получения более подробной информации вы должны изучить документацию Libtool для большей ясности в этих флагах.



РЕДАКТИРОВАТЬ: Поскольку ваш вопрос все еще является общим, позвольте мне изложить его в двух разных сценариях ...

  1. Статический Lib является автономным :

    • В этом сценарии ***_LIBADD может быть не очень полезным, как упомянуто в документации: « переменная library_LIBADD должна использоваться для вывода списка дополнительных объектов libtool (файлы .lo) или библиотек libtool (.la) для добавления в библиотеку"
    • Это означает, что если ваша статическая библиотека не имеет зависимости, тогда этот флаг бесполезен в Makefile.am.
  2. Статический Lib является зависимым (не автономным)

    • Из приведенной выше цитаты из документации теперь ясно, что *Флаг 1081 * используется для упомянутых имен библиотек, которые необходимы для создания вашей текущей библиотеки .
    • Так что этот флаг был бы необходим в таком требовании.

И около ***_LDFLAGS, как указано в документации, Переменная library_LDFLAGS - это место для списка дополнительных флагов связывания libtool для этой библиотеки.

  • Есливаша библиотека не требует таких флагов, тогда это тоже можно игнорировать.Это все о том, как вы хотите, чтобы ваш конечный результат.

Несколько дополнительных ссылок для вашей справки:

Надеюсь, этого EDIT достаточно для того, что вы ищете.

PS: Есливы бы внимательно прочитали мой ответ и просмотрели документацию, вы могли бы получить те же данные.Njoy.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...