![]() |
|
|
![]()
|
|
| Kroll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.4.2012 Репутация: нет Всего: нет |
Вопрос скорее более фундаментальный и должен быть в разделе C/C++, если не ещё выше, но у меня он возник в контексте Qt.
И так, что я знаю. Существует два вида библиотек: статические и разделяемые (динамические). 1) Статическая библиотека Это объектные бинарники, которые после компиляции склеиваются в один файл с расширением .lib или .a. Потом этот файл может быть подставлен в другой проект на этапе линковки вместе с заголовочником и вкомпилен намертво как равноправный с родными объектными файлами этого проекта в конечный исполняемый файл программы. Т.е. по большому счёту статическая библиотека - это обыкновенные объектники. Здесь в основном не понятно, какая информация добавляется в библиотечный архив кроме самих объектных файлов. Ну и ещё про то, можно ли статическую библиотеку подключать, написанную на другом языке. 2) Динамическая библиотека Это архив объектников скомпиленный в .dll или .so с каким-то системным файликом, который позволяет системе подгружать динамическую библиотеку в оперативную память при поступлении запроса. Файл динамической библиотеки всегда существует отдельно от исполняемых программ, которые им пользуются. У динамической библиотеки есть некая таблица экспортируемых символов (если я правильно помню название), в которую вносятся так называемые символы - внутренние библиотечные переменные, функции и классы, которые будут видны для использующих библиотеку программ. Для динамической библиотеки есть два варианта подключения (или импорта) в использующую программу. Первый вариант - раннее связывание (или статический импорт). Ключевое отличие - библиотека подключается на этапе запуска программы и находится в памяти как минимум до завершения её работы. Второй вариант - позднее связывание (или динамический импорт). В этом случае в программе во время выполнения можно подключать и отключать библиотеку через запросы к системе в нужный момент. В Qt этим занимается QLibrary. Вот здесь больше непонятностей. Например, чем всё-таки отличаются механизмы этих вариантов подключения? Первоначально создалось впечатление, что статический импорт это динамический: тем же способом подключается, но один раз при запуске. А потом где-то краем глаза прочитал, что вроде как при компиляции программы в неё включается вроде как файл (почемуто .lib) с таблицей экспортируемых функций и соответствия проверяются на этапе линковки, а только сам вызов на этапе выполнения. Очень не понятен этот момент. Вот здесь пишут:
Откуда тут .lib? Я при сборке имею только заголовочники .h и собственно библиотечный файл. И всё потом работает. В общем очень замутная эта тема с библиотеками. И главное, прочитать об этом достоверно в одном месте не найти где. Знатоки, гуру, просветите пожалуйста. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
1. Как отдельный объектный файл, так и статическая библиотека, так и динамическая библиотека, могут быть написаны на другом языке, если соблюдаются соглашения о передаче параметров и другие соответствия. Труднее подключить библиотеку, написанную на C++, но скомпилированную другим компилятором или другой версиий того же компилятора, используюго другую версию runtime библиотеки.
2. Для раннего связывания нужна кроме dll ещё библиотека импорта. 3. При позднем связывании, кроме подключения dll, нужно найти точки входа. Точки входа обычно объявляются extern "C", чтобы её имя не изменялось (имя обычной функции изменяется и содержит информацию о параметрах; разные компиляторы именят имя по-разному). 4. При позднем связывании невозможно вызвать inline функции - их нет в dll. Применение шаблонов тоже ограничено. Это сообщение отредактировал(а) math64 - 29.9.2014, 07:51 |
|||
|
||||
| Kroll |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 8.4.2012 Репутация: нет Всего: нет |
А где обо всём этом можно подробней прочитать?
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
В принципе - ничем. Просто в первом варианте за тебя всё делает компилятор/линковщик. Они по h-файлу генерят код с LoadLibrary и GetProcAddress (для linux - dlLoad, кажется). Но такой вариант неприемлем, если тебе нужно организовать систему плагинов, т.е. если в разных dll-ках находятся одинаковые по интерфейсу функции, и набор dll-ек неизвестен на этапе компиляции/линковки. Это сообщение отредактировал(а) borisbn - 29.9.2014, 11:06 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Я нигде специально об этом не читал. Просто пробовал разные варианты подключения библиотек, читая в документацию, ища примеры в инете, смотря сгенерированный код в отладчике.
Библиотека импорта обычно состоит из команд jmp по адресу в динамической библиотеке. Никаких вызовов LoadLibrary и GetProcAddress там нет - всем этим занимается загрузчик. Если какая-то dll отсуствет или в ней отсутствует нужный адрес - ваша программа просто не запустится. В случае использования плагины вы должны сами решать что делать (завершать работу или работать без плагина). |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |