MinGW32, Статическая и динамическая сборка, *.dll и *.a, Требуется ликбез |
Здравствуйте, гость ( Вход | Регистрация )
MinGW32, Статическая и динамическая сборка, *.dll и *.a, Требуется ликбез |
Litkevich Yuriy |
16.3.2009, 23:33
Сообщение
#1
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Пришел к выводу полного непонимания типов сборок и назначения файлов *.dll и *.a и как вообще вся эта кухня устроена.
частный случай - виндовоз и MinGW32, Qt4 --== I ==-- вот собираю я Qt с разделяемыми библиотеками (configure -shared ....) создаются dll'ки, это мне ВРОДЕ понятно. 1) При компиляции программы мне нужны только заголовочники для этих dll'ок, сами dll'ки не нужны. 2) При запуске программы она обращается к ОСьке и говорить нужна такая-то функция из такой-то dll'ки. ОСька ищет dll'ку и, если находит, то загружает ее в память, и как-то там говорит моей программе по каким адресам эта функция находиться --== II ==-- вот собираю я Qt статически (configure -static ....) создаются a'шки, это мне тоже ВРОДЕ понятно. 1) При компиляции программы мне нужны уже не только заголовочники для этих a'шек, но и сами a'шки, чтобы линкер соеденил в один exe'шник объектники (*.o) моей программы и Qt'ишные a'шки. 2) При запуске программы она оказывается самодостаточной и просит у ОСьки только стандартные ОСькины функции. Если это все так, то у меня вопрос, а зачем при сборке с разделяемыми библиотеками в каталоге %QTDIR%\lib создается море a'шек? И почему нельзя один Qt'шный корневой каталог использовать для разных типов сборок, ведь в %QTDIR%\lib уже есть и то и другое? |
|
|
BRE |
16.3.2009, 23:55
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Если это все так, то у меня вопрос, а зачем при сборке с разделяемыми библиотеками в каталоге %QTDIR%\lib создается море a'шек? Это разные статические библиотеки (и размеры у них очень разные). При сборке с разделяемыми библиотеками создается dll и a (не большой), вот .а содержит код-переходник для вызова функций из dll. А при статической сборке в .a находится весь код функций. |
|
|
Litkevich Yuriy |
17.3.2009, 0:14
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
17.3.2009, 0:32
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
вот .а содержит код-переходник для вызова функций из dll. т.е. в случае сборки Qt с разделяемыми библиотеками, при компиляции моей программы эти a'шки линкером присоеденяются к объектникам моей программы и потом получается exe'шник?Из объектников (.o) получаются .a, это тоже самое, что и .lib. Линкер использует a./.lib файлы, чтобы сгенерить исполнимый файл. Оттуда он берет адреса функций, переменные, кто что куда экспортирует/импортирует. На этапе линковки .dll файлы не нужны. Если мне память не изменяет, то ld в некоторых случаях может вообще без .a файлов обходится, если есть .dll. |
|
|
Litkevich Yuriy |
17.3.2009, 0:47
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
17.3.2009, 0:52
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Из объектников (.o) получаются .a, ну это не для случая моей программы, а для случая самой Qt. Уменя только *.o создаются в указанных мною каталогах.В .pro файле можно прописать TEMPLATE = lib и собрать какой-нибудь класс, или группу классов. Если он завершен, т.е. ты не будешь его менять также как Qt, то можешь тупо линковать к своей программе, главное, чтобы хедер был, где описан интерфейс/определение класса. Ведь часто нет смысла пересобирать готовый модуль каждый раз вместе с программой. Это и на скорости компиляции скажется. |
|
|
Litkevich Yuriy |
17.3.2009, 2:23
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
BRE |
17.3.2009, 8:17
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
т.е. в случае сборки Qt с разделяемыми библиотеками, при компиляции моей программы эти a'шки линкером присоеденяются к объектникам моей программы и потом получается exe'шник? Да. Если я не ошибаюсь, dll можно вообще убрать, а линкер программу все равно соберет. dll нужны будут только при исполнении программы. |
|
|
SABROG |
17.3.2009, 9:13
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
А для меня так не разрешенным остался такой вопрос. .a библиотеки отличаются чем-нибудь от linux и windows версий?
|
|
|
BRE |
17.3.2009, 9:15
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
Текстовая версия | Сейчас: 21.12.2024, 17:39 |