Статические и динамические библиотеки
+2
Gena
tux
Участников: 6
Страница 1 из 1
Статические и динамические библиотеки
С появлением многозадачных операционных систем (а может быть и раньше) возинкла потребность использовать один и тот же код в разных программах. Как вариант можно было включать исходник с необходимыми функциями в каждую программу, но от этого необходимы были затраты на оперативную память, да и размер самой программы тоже разростался. Тогда было решено делать бинарный код, наподобе самих программ, но в отличии от них имел несколько точек входа, и при этом не мог самостоятельно запускаться на выполнение. Назвали все это динамическими библиотеками, тк они хранили уже откомпилированные функции, которые можно было использовать в нескольких программах одновременно.
Иногда все же требовалось использовать откомпилированный кусок программы именно в самом исполняемом файле (обычно для уменьшения времени компиляции, или когда не хотели передавать код программы в открытом виде). Такие библиотеки получили название статических.
Сейчас же практически все операционные системы используют библиотеки. Так же в библиотеках распространяются множество серьезных программных продуктов, позволяющих программисту без особых проблем решать какие либо задачи (к примеру библиотеки графически и физических движков, библиотеки работы со звуком и пр.)
Динамические библиотеки
В операционной системе Windows эти библиотеки имеют расширение *.dll, в Linux *.so, однако это необязательно, но рекомендуемо.
Создание динамической библиотеки в FreeBASIC-е не представляется ничего сложного. Рассмотрим на примере:
Единственное что бросается в глаза, так это ключевое слово export, которое указывает, что эта функция может быть использована вне программы (точнее вне библиотеки), при этом никто не запрещает использовать ее и в самой библиотеки другими функциями.
Желательно все экспортируемые функции декларировать с ключевым словом alias, тк FreeBASIC при экспорте функции преобразует все названия функций в верхний регистр, и это может запутать, ля этого лучше явно указать под каким именем надо ее экспортировать, и избавиться от лишней головной боли.
В остальном все остается также как и обычных функций.
Ну а теперь откомпилируем нашу библиотеку именно как библиотеку, для этого надо указать соответствующий ключ при компиляции (у меня исходный код в файле mylib.bas):
Как видите здесь нет ничего сложного.
Подключение динамической библиотеки
Ну а теперь попробуем использовать нашу библиотеку в своей программе. Прежде чем подключать библиотеку, надо отметить, что существует два способа это сделать.
Первый способ заключается в том, что библиотеки подключаются при загрузке программы, и сразу загружаются.
Преимущетво такого способа заключается в том, что можно быть уверенным, что загрузку библиотеки за вас выполнит операционная система, и если вдруг произойдет какая либо ошибка, то она вам сообщит о ней.
Недостаток - необходимо четко знать название всех функций библиотеки и самой библиотеки, если будет какое либо несоответствие, то программа вообще не запустится. Также из недостатков можно отметить то, что требуется оперативной памяти, необходимой для загрузки всех библиотек сразу.
Второй способ, это подключать библиотеки во время выполнения программы.
Преимущесто этого метода заключается в том, что нет необходимости точно знать название библиотеки, те можно его узнать во время выполнения программы, или дать возможность пользователю выбрать его. С помощью этого метода реализуется технология так называемых "плагинов".
При реализации этого метода необходимо "вручную" выполнять загрузку и выгрузку библиотек, что представляет некие трудности, но и при этом гибкость, позволяя программисту оперировать с библиотеками по своему усмотрению.
Ну а теперь от теории к практике. Напишем программку вида:
В первой строчке декларируем нашу функцию. В принципе все также как и в декларации обычных функций за исключением ключевого слова lib после которого указывается название библиотеки, и слова alias о которой было сказано выше. Хоть alias и не является обязательным, если используется то же название функции, всеже использовать его рекомендуется во избежании проблем.
А теперь попробуем динамически подключить нашу библиотекую. Для этого используются функции DyLibLoad - для загрузки библиотеки в память, DyLibFree - для выгрузки библиотеки, DyLibSymbol - для получения указателя на функцию библиотеки.
Рассмотрим на примере:
теперь мы можем использовать нашу функцию в своей программе:
Статические библиотеки
Статические библиотеки в отличие от динамических "вкомпилирываются" в код самой программы.
Создание исходного кода статической библиотеки ничем не отличается от предыдущего примера, поэтому им и воспользуемся.
Статические библиотеки в Windows имеют расширение *.lib, в linux *.a.
Для создания статической библиотеки используется ключ компилятора -lib
Подключать статическую библиотеку можно только одним способом, который рассмотрим на примере:
Совмесное использование статических и динамических библиотек
Часто вместе с динамическими библиотеками распространяют статические. Весь основной код программы находится в динамической, а статическая служит связующим звеном между программой и динамической библиотекой.
Статическая библиотека преобразует все функции в необходимый формат для корректного оперирования с ними с обоих сторон, часто это делается тогда, когда библиотеки пишутся на сторонних языках.
Иногда все же требовалось использовать откомпилированный кусок программы именно в самом исполняемом файле (обычно для уменьшения времени компиляции, или когда не хотели передавать код программы в открытом виде). Такие библиотеки получили название статических.
Сейчас же практически все операционные системы используют библиотеки. Так же в библиотеках распространяются множество серьезных программных продуктов, позволяющих программисту без особых проблем решать какие либо задачи (к примеру библиотеки графически и физических движков, библиотеки работы со звуком и пр.)
Динамические библиотеки
В операционной системе Windows эти библиотеки имеют расширение *.dll, в Linux *.so, однако это необязательно, но рекомендуемо.
Создание динамической библиотеки в FreeBASIC-е не представляется ничего сложного. Рассмотрим на примере:
- Код:
declare function fSumma alias "fSumma" (byval pX as integer, byval pY as integer) as integer
function fSumma(byval pX as integer, byval pY as integer) as integer export
function=pX+pY
end function
Единственное что бросается в глаза, так это ключевое слово export, которое указывает, что эта функция может быть использована вне программы (точнее вне библиотеки), при этом никто не запрещает использовать ее и в самой библиотеки другими функциями.
Желательно все экспортируемые функции декларировать с ключевым словом alias, тк FreeBASIC при экспорте функции преобразует все названия функций в верхний регистр, и это может запутать, ля этого лучше явно указать под каким именем надо ее экспортировать, и избавиться от лишней головной боли.
В остальном все остается также как и обычных функций.
Ну а теперь откомпилируем нашу библиотеку именно как библиотеку, для этого надо указать соответствующий ключ при компиляции (у меня исходный код в файле mylib.bas):
- Код:
fbc -dll mylib.bas
Как видите здесь нет ничего сложного.
Подключение динамической библиотеки
Ну а теперь попробуем использовать нашу библиотеку в своей программе. Прежде чем подключать библиотеку, надо отметить, что существует два способа это сделать.
Первый способ заключается в том, что библиотеки подключаются при загрузке программы, и сразу загружаются.
Преимущетво такого способа заключается в том, что можно быть уверенным, что загрузку библиотеки за вас выполнит операционная система, и если вдруг произойдет какая либо ошибка, то она вам сообщит о ней.
Недостаток - необходимо четко знать название всех функций библиотеки и самой библиотеки, если будет какое либо несоответствие, то программа вообще не запустится. Также из недостатков можно отметить то, что требуется оперативной памяти, необходимой для загрузки всех библиотек сразу.
Второй способ, это подключать библиотеки во время выполнения программы.
Преимущесто этого метода заключается в том, что нет необходимости точно знать название библиотеки, те можно его узнать во время выполнения программы, или дать возможность пользователю выбрать его. С помощью этого метода реализуется технология так называемых "плагинов".
При реализации этого метода необходимо "вручную" выполнять загрузку и выгрузку библиотек, что представляет некие трудности, но и при этом гибкость, позволяя программисту оперировать с библиотеками по своему усмотрению.
Ну а теперь от теории к практике. Напишем программку вида:
- Код:
declare function fSumm lib "mylib.dll" alias "fSumm" (byval pX as integer, byval pY as integer) as integer
print fSumm(3, 5)
sleep
В первой строчке декларируем нашу функцию. В принципе все также как и в декларации обычных функций за исключением ключевого слова lib после которого указывается название библиотеки, и слова alias о которой было сказано выше. Хоть alias и не является обязательным, если используется то же название функции, всеже использовать его рекомендуется во избежании проблем.
А теперь попробуем динамически подключить нашу библиотекую. Для этого используются функции DyLibLoad - для загрузки библиотеки в память, DyLibFree - для выгрузки библиотеки, DyLibSymbol - для получения указателя на функцию библиотеки.
Рассмотрим на примере:
- Код:
dim ppMyLib as any ptr
dim fSumma as function (byval pX as integer, byval pY as integer) as integer
ppMyLib=dylibload("mylib.dll")
if ppMyLib=0 then
print "Ошибка: не найдена библиотека"
sleep
end 1
end if
fSumma=dylibsymbol(ppMyLib, "fSumma")
if fSumma=0 then
print "Ошибка: не найдена функция в библиотеке"
sleep
end 1
end if
print fSumma(3, 5)
dylibfree ppMyLib
sleep
- Код:
dim ppMyLib as any ptr
- Код:
dim fSumma as function (byval pX as integer, byval pY as integer) as integer
- Код:
ppMyLib=dylibload("mylib.dll")
if ppMyLib=0 then
print "Ошибка: не найдена библиотека"
sleep
end 1
end if
- Код:
fSumma=dylibsymbol(ppMyLib, "fSumma")
if fSumma=0 then
print "Ошибка: не найдена функция в библиотеке"
sleep
end 1
end if
теперь мы можем использовать нашу функцию в своей программе:
- Код:
print fSumma(3, 5)
- Код:
dylibfree ppMyLib
Статические библиотеки
Статические библиотеки в отличие от динамических "вкомпилирываются" в код самой программы.
Создание исходного кода статической библиотеки ничем не отличается от предыдущего примера, поэтому им и воспользуемся.
Статические библиотеки в Windows имеют расширение *.lib, в linux *.a.
Для создания статической библиотеки используется ключ компилятора -lib
- Код:
fbc -lib mylib.bas
Подключать статическую библиотеку можно только одним способом, который рассмотрим на примере:
- Код:
#inclib "mylib"
declare function fSumma alias "fSumma" (byval pX as integer, byval pY as integer) as integer
print fSumma(3, 5)
sleep
Совмесное использование статических и динамических библиотек
Часто вместе с динамическими библиотеками распространяют статические. Весь основной код программы находится в динамической, а статическая служит связующим звеном между программой и динамической библиотекой.
Статическая библиотека преобразует все функции в необходимый формат для корректного оперирования с ними с обоих сторон, часто это делается тогда, когда библиотеки пишутся на сторонних языках.
Последний раз редактировалось: tux (Ср Май 20, 2009 7:28 pm), всего редактировалось 1 раз(а)
Re: Статические и динамические библиотеки
Народ, будте добры, у кого будет время, проверьте исходники, просто ща под рукой винды нет, все из Линуха писал
Re: Статические и динамические библиотеки
Не подскажите, как узнать доступные функции? - ведь без этого никак.
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва
Re: Статические и динамические библиотеки
эээ, ну вообще, по хорошему, с библиотеками, которые предоставляются разработчикам, оставляют заголовочные файлы, в которых все эти функции и описаны, а из чужой библиотеки мона узнать тока названия функций и размер параметров (допустим если просмотреть библиотеку в шестнадцатеричном редакторе), сами параметры функций из откомпилированной библиотеки узнать невозможно, хотя если методом тыка...))
Re: Статические и динамические библиотеки
Хочу написать одну очень неприятную вещь. Меня, лично, она всегда бесила. Но против правды не попрёшь.
Нужно тыркаться в тыртырнете. Инет этоже такая свалка всего!
А если влом искать, то хоть уточните, что за dll. Может быть мы знаем и подскажем.
Нужно тыркаться в тыртырнете. Инет этоже такая свалка всего!
А если влом искать, то хоть уточните, что за dll. Может быть мы знаем и подскажем.
Re: Статические и динамические библиотеки
Gena пишет:Не подскажите, как узнать доступные функции? - ведь без этого никак.
Откройте ДЛЛ в блокноте и ближе к концу файла там открытым текстом будут прописаны все экспортируемые функции.
vbman- Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 42
Откуда : Украина, Кировоград
Re: Статические и динамические библиотеки
тока толку от них нет никакого, если незнаеш какие параметры необходимо передавать етим функциям...
Re: Статические и динамические библиотеки
В каком-нибудь хекс-редакторе можно просмотреть имена функций, но от этого толку никакого.
Я сейчас перешел на Purebasic, в нем есть две функции: GetLibraryFunctionName и GetLibraryfunctionParameter, вот с помощью них можно узнать все о DLL.
Кстати, даже где-то встречал уже исходник прожки, которая из либы вытаскивает все имена функций с количеством параметров и их входными данными, себе не скачал этот исходник, так как у меня последняя версия компилятора, и в нем сильно поменялся синтаксис, а править код влом.
Если будет интересно, поищу еще раз.
Я сейчас перешел на Purebasic, в нем есть две функции: GetLibraryFunctionName и GetLibraryfunctionParameter, вот с помощью них можно узнать все о DLL.
Кстати, даже где-то встречал уже исходник прожки, которая из либы вытаскивает все имена функций с количеством параметров и их входными данными, себе не скачал этот исходник, так как у меня последняя версия компилятора, и в нем сильно поменялся синтаксис, а править код влом.
Если будет интересно, поищу еще раз.
Re: Статические и динамические библиотеки
Маленькое дополнение
Использовать динамическое подключение библиотеки надо с осторожностью, так как компилятор на этапе компиляции не может проверить количество и правильность передаваемых в функцию библиотеки параметров. Хуже всего то, что ошибка может проявится не сразу - для некоторых значений функция библиотеки будет возвращать правильный результат, а для некоторых ...
Использование даного способа подключения оправдано в программах с модулями расширения (модулями работы с оборудованием) когда есть несколько библиотек с одинаковым интерфейсом. На етапе выполнения программа решит конкретно какой библиотекой пользоватся и вызвет необходимые функции. На этом принципе построена работа Total Commander с плагинами.
Использовать динамическое подключение библиотеки надо с осторожностью, так как компилятор на этапе компиляции не может проверить количество и правильность передаваемых в функцию библиотеки параметров. Хуже всего то, что ошибка может проявится не сразу - для некоторых значений функция библиотеки будет возвращать правильный результат, а для некоторых ...
Использование даного способа подключения оправдано в программах с модулями расширения (модулями работы с оборудованием) когда есть несколько библиотек с одинаковым интерфейсом. На етапе выполнения программа решит конкретно какой библиотекой пользоватся и вызвет необходимые функции. На этом принципе построена работа Total Commander с плагинами.
gromov- Сообщения : 7
Дата регистрации : 2008-08-31
Возраст : 46
Откуда : Украина, Броды
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения