Правильный способ компоновки статической библиотеки с помощью GCC

Почему некоторые статические библиотеки (lib*.a) могут быть связаны таким же образом, как общие библиотеки (lib*.so) связаны (ld -l переключаться), а некоторые не могут?

Меня всегда учили, что все библиотеки, статические или нет, могут быть связаны с -l..., однако до сих пор я столкнулся с одной библиотекой (GLFW), которая ничего не делает, кроме ссылки "неопределенная ссылка" ошибки, если я попытаюсь связать это таким образом.

Согласно ответу на этот вопрос, «правильный» способ компоновки статических библиотек — включать их напрямую вместе с моими собственными объектными файлами, а не использовать -l. А в случае с библиотекой GLFW это, безусловно, решает проблему. Но любая другая статическая библиотека, которую я использую, отлично работает, когда связана с -l.

Итак:

  • Что может привести к тому, что эта единственная библиотека не будет работать, когда она связана, а не включена напрямую? Если бы я знал причину, возможно, я мог бы отредактировать и перекомпилировать библиотеку, чтобы исправить проблему.
  • Правда ли, что вы не должны связывать статические библиотеки так же, как вы связываете общие библиотеки? (А если нет, то почему?)
  • Способен ли компоновщик удалить неиспользуемые библиотечные функции из выходного исполняемого файла, когда библиотека напрямую подключается таким образом?

22
задан Community 23 May 2017 в 12:32
поделиться