Russian Qt Forum
Ноябрь 23, 2024, 06:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Статическая и динамическая сборка библиотек.  (Прочитано 17877 раз)
Aleksey_Zh
Гость
« : Ноябрь 10, 2009, 15:38 »

В Qt я пока новичок.
1. Подскажите, в чем разница в статической и динамической сборки библиотек. Грубо говоря есть у меня некоторая dll. Путем несложных махинаций я ее превращая в файл с расширением .a Добавляю в проект как LIBS+=имя библиотеки.
Это какая сборка?
2. В чем разница между статическим и динамическим подключением библиотек. И как осуществляется одно и другое?

P.S. Windows/mingw
« Последнее редактирование: Ноябрь 11, 2009, 08:42 от Aleksey_Zh » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Ноябрь 10, 2009, 16:10 »

В Qt я пока новичок.
1. Подскажите, в чем разница в статической и динамической сборки библиотек. Грубо говоря есть у меня некоторая dll. Путем несложных махинаций я ее превращая в файл с расширением .a Добавляю в проект как LIBS+=имя библиотеки.
Это какая сборка?
2. В чем разница между статическим и динамическим подключением библиотек. И как осуществляется одно и другое?
Qt здесь ни при чем. Насколько я знаю (опыт в Линукс 1 месяц) .а - статическая библиотека, .so - динамическая. В общем случае (для любой платформы)

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

Динамические библиотеки могут быть замаскированы под статические (вероятно это результат упоминаемых Вами махинаций). Например в том же Вындоуз (MS 2009) я подключаю к проекту

- kernel32.lib
- mycalc.lib

В обоих есть ф-ции которые программа вызывает. Но в mycalc.lib - это сами ф-ции (статически) а в kernel32.lib - это вызовы нужных ф-ций из модуля kernel (динамчески). Никто не мешает быть статической либе просто "оберткой" для динамческой.

Ну и все это конечно как я себе это представляю и как достаточно для моих задач. А вообще в этом вопросе не силен и хотелось бы услышать мнения знатоков Улыбающийся
Записан
Aleksey_Zh
Гость
« Ответ #2 : Ноябрь 10, 2009, 16:22 »

Спасибо Igors! Сейчас гуглил по нету и пришел такому же мнению насчет статики(что это *.а). Про динамические библиотеки - думал что это только dll. Подскажите, если знаете, в чем отличается динамическая от статической линковки. И как к динамически собранной куте прилинковать статическую библиотеку.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #3 : Ноябрь 10, 2009, 16:31 »

при статике как уже сказано весь код встраивается в твое приложение
при динамике в бинарнике только вызовы к dll
когда ты собираешь приложение, ты указывашь путь к библиотеке (-Lpath). Если по этому пути лежит .dll то линкуется к динамически ней. Если там есть .а, то идет статик линк. Проверено на вин\мак. Возможно есть способ указать напрямую тип линковки (может быть даже через CONFIG+=static в своем приложении)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Ноябрь 10, 2009, 16:36 »

Спасибо Igors! Сейчас гуглил по нету и пришел такому же мнению насчет статики(что это *.а). Про динамические библиотеки - думал что это только dll. Подскажите, если знаете, в чем отличается динамическая от статической линковки. И как к динамически собранной куте прилинковать статическую библиотеку.
Динамическим модулем может быть файл с любым именем/расширением. В 1 проекте может быть сколько угодно статических и динамических библиотек - это не вопрос. Но каждая ф-ция должна быть определена только в 1 библиотеке - иначе не слинкуется. То есть библиотеки не должны "пересекаться".

Ф-ция статической либы линкуется точно так же как и ф-ция написанная в программе. Для ф-ции вызываемой динамически компилятор строит специальные дополнения в коде - на каждой платформе по-разному и рассказывать довольно долго, но смысл один -  обеспечить вызов ф-ции из др. модуля.
Записан
Aleksey_Zh
Гость
« Ответ #5 : Ноябрь 10, 2009, 22:28 »

Авварон, CONFIG+=static - это куда именно прописывается? И как система поймет, что это относится к конкретной библиотеке?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Ноябрь 11, 2009, 01:12 »

это пишется в .pro-файл. Никак. Как я уже отмечал выше, она старается линковаться динамически, если динамики нет, пробует статику. Если и ее нет, ругается. Мб этот конфиг помняет порядок - заставит сначала пробовать статику. Но если и сработает, то для всех библиотек проекта
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Ноябрь 11, 2009, 04:25 »

Aleksey_Zh, а речь идёт про виндовоз?
Записан

Юра.
Aleksey_Zh
Гость
« Ответ #8 : Ноябрь 11, 2009, 08:40 »

Да, конечно про Windows+mingw. Сейчас поправлю заголовок.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.