Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анатомия библиотек, Механизмы создания и использования 
:(
    Опции темы
Kroll
Дата 28.9.2014, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.4.2012

Репутация: нет
Всего: нет



Вопрос скорее более фундаментальный и должен быть в разделе C/C++, если не ещё выше, но у меня он возник в контексте Qt.

И так, что я знаю.

Существует два вида библиотек: статические и разделяемые (динамические).

1) Статическая библиотека
Это объектные бинарники, которые после компиляции склеиваются в один файл с расширением .lib или .a. Потом этот файл может быть подставлен в другой проект на этапе линковки вместе с заголовочником и вкомпилен намертво как равноправный с родными объектными файлами этого проекта в конечный исполняемый файл программы. Т.е. по большому счёту статическая библиотека - это обыкновенные объектники.

Здесь в основном не понятно, какая информация добавляется в библиотечный архив кроме самих объектных файлов. Ну и ещё про то, можно ли статическую библиотеку подключать, написанную на другом языке.

2) Динамическая библиотека
Это архив объектников скомпиленный в .dll или .so с каким-то системным файликом, который позволяет системе подгружать динамическую библиотеку в оперативную память при поступлении запроса. Файл динамической библиотеки всегда существует отдельно от исполняемых программ, которые им пользуются. У динамической библиотеки есть некая таблица экспортируемых символов (если я правильно помню название), в которую вносятся так называемые символы - внутренние библиотечные переменные, функции и классы, которые будут видны для использующих библиотеку программ.

Для динамической библиотеки есть два варианта подключения (или импорта) в использующую программу.
Первый вариант - раннее связывание (или статический импорт). Ключевое отличие - библиотека подключается на этапе запуска программы и находится в памяти как минимум до завершения её работы.
Второй вариант - позднее связывание (или динамический импорт). В этом случае в программе во время выполнения можно подключать и отключать библиотеку через запросы к системе в нужный момент. В Qt этим занимается QLibrary.

Вот здесь больше непонятностей. Например, чем всё-таки отличаются механизмы этих вариантов подключения? Первоначально создалось впечатление, что статический импорт это динамический: тем же способом подключается, но один раз при запуске. А потом где-то краем глаза прочитал, что вроде как при компиляции программы в неё включается вроде как файл (почемуто .lib) с таблицей экспортируемых функций и соответствия проверяются на этапе линковки, а только сам вызов на этапе выполнения. Очень не понятен этот момент.

Вот здесь пишут:
Цитата

Присоединение разделяемой библиотеки к приложению

Чтобы использовать разделяемую библиотеку в приложении, вы можете включить ее заголовок в ваш код и использовать доступные методы. Скомпилируйте и соберите с.lib файл. Во время выполнения будет загружена dll, у которой имеется реализация.

Для успешной сборки, в файле .pro необходимо сообщить приложению, где найти заголовки и библиотеки. INCLUDEPATH [qt-project.org] должен указывать на каталог, где находятся заголовки, и LIBS [qt-project.org] переменная должна указывать на каталог с .lib файлом. Кроме того, необходимо удостовериться, что .dll будет находиться в указанном месте или помещена в каталог приложения или путь к ней описан в переменной PATH.


Откуда тут .lib? Я при сборке имею только заголовочники .h и собственно библиотечный файл. И всё потом работает.

В общем очень замутная эта тема с библиотеками. И главное, прочитать об этом достоверно в одном месте не найти где.

Знатоки, гуру, просветите пожалуйста.
PM MAIL   Вверх
math64
Дата 29.9.2014, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



1. Как отдельный объектный файл, так и статическая библиотека, так и динамическая библиотека, могут быть написаны на другом языке, если соблюдаются соглашения о передаче параметров и другие соответствия. Труднее подключить библиотеку, написанную на C++, но скомпилированную другим компилятором или другой версиий того же компилятора, используюго другую версию runtime библиотеки.
2. Для раннего связывания нужна кроме dll ещё библиотека импорта.
3. При позднем связывании, кроме подключения dll, нужно найти точки входа. Точки входа обычно объявляются extern "C", чтобы её имя не изменялось (имя обычной функции изменяется и содержит информацию о параметрах; разные компиляторы именят имя по-разному).
4. При позднем связывании невозможно вызвать inline функции - их нет в dll.
Применение шаблонов тоже ограничено.

Это сообщение отредактировал(а) math64 - 29.9.2014, 07:51
PM   Вверх
Kroll
Дата 29.9.2014, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.4.2012

Репутация: нет
Всего: нет



А где обо всём этом можно подробней прочитать?
PM MAIL   Вверх
borisbn
Дата 29.9.2014, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Kroll @  28.9.2014,  11:14 Найти цитируемый пост)
 чем всё-таки отличаются механизмы этих вариантов подключения? 

В принципе - ничем. Просто в первом варианте за тебя всё делает компилятор/линковщик. Они по h-файлу генерят код с LoadLibrary и GetProcAddress (для linux - dlLoad, кажется). Но такой вариант неприемлем, если тебе нужно организовать систему плагинов, т.е. если в разных dll-ках находятся одинаковые по интерфейсу функции, и набор dll-ек неизвестен на этапе компиляции/линковки.

Это сообщение отредактировал(а) borisbn - 29.9.2014, 11:06


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 29.9.2014, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Цитата(Kroll @  29.9.2014,  10:47 Найти цитируемый пост)
А где обо всём этом можно подробней прочитать? 

Я нигде специально об этом не читал. Просто пробовал разные варианты подключения библиотек, читая в документацию, ища примеры в инете, смотря сгенерированный код в отладчике.
Цитата(borisbn @  29.9.2014,  11:04 Найти цитируемый пост)
Просто в первом варианте за тебя всё делает компилятор/линковщик. Они по h-файлу генерят код с LoadLibrary и GetProcAddress (для linux - dlLoad, кажется). 

Библиотека импорта обычно состоит из команд jmp по адресу в динамической библиотеке. Никаких вызовов LoadLibrary и GetProcAddress там нет - всем этим занимается загрузчик. Если какая-то dll отсуствет или в ней отсутствует нужный адрес - ваша программа просто не запустится. В случае использования плагины вы должны сами решать что делать (завершать работу или работать без плагина).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.