В чем разница между LDADD и LIBADD?
Я пытаюсь настроить проект automake, в котором используется сочетание библиотек libtool и exectuables, и мне сложно с трудом подхватить документацию automake, особенно. что связано с тем, что компилятор ссылается на него.
Так может кто-нибудь объяснить различия между LDADD
и LIBADD
?
Вещи вроде:
- когда используется один, другой
- который берет
-lname_of_library
значения стиля против прямых имен файлов,
и др.
Всякий раз, когда я пытаюсь прочитать соответствующую документацию, кажется, что он предполагает, что я знаю то, чего не знаю.
Ответы
Ответ 1
Используйте LIBADD
primary для библиотек и LDADD
для исполняемых файлов. Если вы строили библиотеку libtool libfoo.la
, которая зависела от другой библиотеки libbar.la
, вы бы использовали:
libfoo_la_LIBADD = libbar.la
Если у вас были другие библиотеки, отличные от libtool, вы также добавили бы их с параметрами -L
и -L
:
libfoo_la_LIBADD = libbar.la -L/opt/local/lib -lpng
Как правило, вы можете использовать configure script, чтобы найти эти дополнительные библиотеки, и используйте AC_SUBST
, чтобы передать их с помощью:
libfoo_la_LIBADD = libbar.la $(EXTRA_FOO_LIBS)
Для программы просто используйте LDADD
:
myprog_LDADD = libfoo.la # links libfoo, libbar, and libpng to myprog.
Иногда границы немного расплывчаты. $(EXTRA_FOO_LIBS)
можно было бы добавить в myprog_LDADD
. Добавление зависимостей в библиотеку libtool (.la
) и использование libtool
делают всю манеру компоновщика конкретной платформы, обычно это лучший подход. Он сохраняет все метаданные компоновщика в одном месте.
Ответ 2
Как упоминалось в одной из книг, LDADD
- это элементы ADDitional linker (LD), то есть элементы, которые добавляются при выполнении связывания. Это было бы, например, при создании программ. LDADD
может указывать:
- файлы libtool, например.
lib/libfudge.la
- библиотеки, например.
-lm
, или
- полные пути к библиотекам, например.
/lib/libmagicalwonderland.a
- флаги и библиотеки ссылок, например.
-L/opt/lib -lmagical
Они в порядке предпочтения. Использование двух последних просто требует неприятностей, поскольку они указывают на то, что может или не может присутствовать.
LIBADD
- указать ADDitional LIBraries для использования. Это используется при создании библиотеки, чтобы указать, что необходимы дополнительные библиотеки для создания или использования библиотеки. Вы увидите, что это указано как что-то вроде libfred_la_LIBADD =
. Его можно использовать для указания библиотек libtool или системных библиотек и поместить эти библиотеки в полученный libtool .la
для библиотеки, поэтому, когда дело доходит до связывания с библиотекой, вы получаете все соответствующие библиотеки.
Вы должны указывать только ссылки на библиотеки, поэтому, например, моя библиотека libfred.la
зависит от некоторых математических процедур, то есть зависит от libm
. Когда я указываю дополнительные библиотеки для библиотеки, я указываю:
libfred_la_LIBADD = -lm
Эта зависимость кодируется, когда я создаю библиотеку и передается также пользователям библиотеки.
Правило большого пальца:
- LIBADD для вещей, которые добавляются в библиотеку
- LDADD для вещей, которые добавляются в программу