Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Инструменты разработчика _ MinGW32, Статическая и динамическая сборка, *.dll и *.a

Автор: Litkevich Yuriy 16.3.2009, 23:33

Пришел к выводу полного непонимания типов сборок и назначения файлов *.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

Цитата(Litkevich Yuriy @ 16.3.2009, 23:33) *
Если это все так, то у меня вопрос, а зачем при сборке с разделяемыми библиотеками в каталоге %QTDIR%\lib создается море a'шек?

Это разные статические библиотеки (и размеры у них очень разные).
При сборке с разделяемыми библиотеками создается dll и a (не большой), вот .а содержит код-переходник для вызова функций из dll.
А при статической сборке в .a находится весь код функций.

Автор: Litkevich Yuriy 17.3.2009, 0:14

Цитата(BRE @ 17.3.2009, 2:55) *
вот .а содержит код-переходник для вызова функций из dll.
т.е. в случае сборки Qt с разделяемыми библиотеками, при компиляции моей программы эти a'шки линкером присоеденяются к объектникам моей программы и потом получается exe'шник?

Автор: SABROG 17.3.2009, 0:32

Цитата(Litkevich Yuriy @ 17.3.2009, 0:14) *
Цитата(BRE @ 17.3.2009, 2:55) *
вот .а содержит код-переходник для вызова функций из dll.
т.е. в случае сборки Qt с разделяемыми библиотеками, при компиляции моей программы эти a'шки линкером присоеденяются к объектникам моей программы и потом получается exe'шник?

Из объектников (.o) получаются .a, это тоже самое, что и .lib. Линкер использует a./.lib файлы, чтобы сгенерить исполнимый файл. Оттуда он берет адреса функций, переменные, кто что куда экспортирует/импортирует. На этапе линковки .dll файлы не нужны. Если мне память не изменяет, то ld в некоторых случаях может вообще без .a файлов обходится, если есть .dll.

Автор: Litkevich Yuriy 17.3.2009, 0:47

Цитата(SABROG @ 17.3.2009, 3:32) *
Из объектников (.o) получаются .a,
ну это не для случая моей программы, а для случая самой Qt. Уменя только *.o создаются в указанных мною каталогах.

Автор: SABROG 17.3.2009, 0:52

Цитата(Litkevich Yuriy @ 17.3.2009, 0:47) *
Цитата(SABROG @ 17.3.2009, 3:32) *
Из объектников (.o) получаются .a,
ну это не для случая моей программы, а для случая самой Qt. Уменя только *.o создаются в указанных мною каталогах.

В .pro файле можно прописать TEMPLATE = lib и собрать какой-нибудь класс, или группу классов. Если он завершен, т.е. ты не будешь его менять также как Qt, то можешь тупо линковать к своей программе, главное, чтобы хедер был, где описан интерфейс/определение класса. Ведь часто нет смысла пересобирать готовый модуль каждый раз вместе с программой. Это и на скорости компиляции скажется.

Автор: Litkevich Yuriy 17.3.2009, 2:23

Цитата(SABROG @ 17.3.2009, 3:52) *
В .pro файле можно прописать TEMPLATE = lib и собрать ...
это я знаю, я про разные варианты *.a не знал.

Автор: BRE 17.3.2009, 8:17

Цитата(Litkevich Yuriy @ 17.3.2009, 0:14) *
т.е. в случае сборки Qt с разделяемыми библиотеками, при компиляции моей программы эти a'шки линкером присоеденяются к объектникам моей программы и потом получается exe'шник?

Да.
Если я не ошибаюсь, dll можно вообще убрать, а линкер программу все равно соберет. dll нужны будут только при исполнении программы.

Автор: SABROG 17.3.2009, 9:13

А для меня так не разрешенным остался такой вопрос. .a библиотеки отличаются чем-нибудь от linux и windows версий?

Автор: BRE 17.3.2009, 9:15

Цитата(SABROG @ 17.3.2009, 9:13) *
А для меня так не разрешенным остался такой вопрос. .a библиотеки отличаются чем-нибудь от linux и windows версий?

В linux .а статическая библиотека. Для динамической .a не создается, линкер сразу .so пользуется.

Автор: SABROG 17.3.2009, 9:24

Цитата(BRE @ 17.3.2009, 9:15) *
Цитата(SABROG @ 17.3.2009, 9:13) *
А для меня так не разрешенным остался такой вопрос. .a библиотеки отличаются чем-нибудь от linux и windows версий?

В linux .а статическая библиотека. Для динамической .a не создается, линкер сразу .so пользуется.

А если я возьму статическую библиотеку скомпиленную в linux и попытаюсь её прилинковать к программе в windows, будет какая-нибудь разница?
Предположим, что код в ней портабельный. Никакой привязки к API OS или сторонним библиотекам.

Автор: BRE 17.3.2009, 9:28

Цитата(SABROG @ 17.3.2009, 9:24) *
А если я возьму статическую библиотеку скомпиленную в linux и попытаюсь её прилинковать к программе в windows, будет какая-нибудь разница?
Предположим, что код в ней портабельный. Никакой привязки к API OS или сторонним библиотекам.

Форматы разные, думаю ничего не получиться.
В .a, как ты и писал выше, лежат .o, а они, по идее, уже под собираемую платформу заточены.
Хотя, если привязки никакой нет и форматы .o mingw и gcc одинаковые, все может быть. :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)