Использует ли статически связанный libcurl динамически связанные библиотеки?

#c #libcurl #static-linking #dynamic-linking

#c #libcurl #статическое связывание #динамическое связывание

Вопрос:

* Отказ от ответственности: я новичок, который пытается узнать, как использовать сторонние библиотеки. *

Я рассматриваю возможность использования libcurl для проекта, и я хочу статически связать его с моим проектом, чтобы он был включен в мой конечный исполняемый файл.

В некоторой документации в Интернете говорится:

По умолчанию configure настроит файлы сборки так, что следующая команда make file создаст как общие, так и статические версии libcurl. Вы можете изменить это с —disable-static —disabled-shared помощью параметров и для настройки.

Если вместо этого вы хотите создавать статические версии сторонних библиотек вместо разделяемых библиотек, вам нужно подготовиться к тяжелой битве….

Они говорят о библиотеках, которые использует libcurl? Я думаю, я спрашиваю: даже если я создам libcurl и свяжу статически, будет ли libcurl по-прежнему динамически связываться с сторонними библиотеками?

Это то, о чем это говорит?

Комментарии:

1. Вы абсолютно можете статически связать libcurl , если это то, что вы спрашиваете.

2. Но что хорошего в статическом связывании, если libcurl зависит от динамических библиотек? Наверное, я что-то упускаю.

3. Это не зависит от динамических библиотек, это фрагмент кода, который вы можете статически связать в своем исполняемом файле, если хотите.

4. Спасибо за ваш ответ. Что, если он включал динамически связанный код? Или это не имеет смысла для такой библиотеки?

Ответ №1:

Дело в том, что статическая библиотека на самом деле представляет собой не что иное, как архив объектных файлов. Связывание со статической библиотекой — это то же самое, что связывание с самими отдельными объектными файлами. Это означает, что любая сторонняя зависимость, которую имеет библиотека, также становится зависимостью для вашего приложения. И вы должны связать с этими сторонними библиотеками и зависимостями, когда вы связываете свое приложение.

Теперь для самого libcurl, в зависимости от того, как вы настраиваете и создаете libcurl, это может зависеть от некоторых сторонних библиотек, которые не могут быть статически связаны с вашим приложением.

Итак, чтобы ответить на ваш вопрос: это зависит.

В основном это зависит от того, как вы настраиваете его для сборки, и какие сторонние библиотеки вы указываете ему использовать, и доступны ли эти сторонние библиотеки как статические библиотеки (а затем к их зависимостям и так далее).

Комментарии:

1. О man….so возможно, я не понимаю динамические ссылки так хорошо, как следовало бы. У меня просто есть еще вопросы. Кажется, что почти так, зачем вам когда-либо хотеть связывать что-либо динамически. Разве это не похоже на ставку на то, что у человека, запускающего программу, где-то будет установлена эта библиотека? Возможно, это глупый вопрос. Я чувствую, что не могу найти никаких объяснений, которые доходят до меня.

2. Вы можете использовать ldd , чтобы увидеть, от каких динамических библиотек зависит ваш скомпилированный код. man7.org/linux/man-pages/man1/ldd.1.html . См . Также lddtree . codeyarns.com/tech /…

3. @pocketonion «Динамическое связывание» с библиотеками полезно, если вы помните, что такие библиотеки также называются разделяемыми библиотеками. Это означает, что каждая программа, использующая эту библиотеку, использует один экземпляр библиотеки. Если вы свяжете статически, то у всей программы будет своя собственная копия библиотеки, которая отнимает много места (как на диске, так и, безусловно, в памяти).