Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

библиотеки программирования

11,229 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

библиотеки программирования

  1. 1. БИБЛИОТЕКИПРОГРАММИРОВАНИЯМихаил Кройтор
  2. 2. Содержание Что такое библиотека программирования Виды библиотек программирования Структура библиотек программирования Особенности библиотек программирования Рекомендации Разработка библиотек программирования Статические библиотеки Динамические библиотеки Использование библиотек программирования Неявное связывание Явное связывание
  3. 3. Библиотеки ПрограммированияПод библиотеками программированияпонимают архивы ресурсов программирования,таких как функции, классы, объекты, константы иразличные переменные.В частности, константами могут быть заданы графические илимультимедийные данные.
  4. 4. Виды библиотек программирования Статические библиотеки При компиляции в программу вставляются кускиобъектного кода из библиотеки, представляющиефункцию (класс или другой ресурс). Динамические библиотеки При компиляции в программу вставляются вызовыфункций (ссылки на ресурсы) из динамическойбиблиотеки.
  5. 5. Структура библиотек программирования Заголовочныйфайл Статическаябиблиотека Заголовочныйфайл Библиотекаимпорта ДинамическаябиблиотекаСтатические библиотеки Динамические библиотеки*.h*.lib(*.a)*.h*.lib(*.a)*.dll(*.so)
  6. 6. Особенности библиотек программирования В программу включается кодтолько используемыхфункций. Программа не зависит отналичия библиотек в ОС. Занимают относительно маломеста в О.П. Большой размер программ. В случает обновлениябиблиотеки требуетсяперекомпиляция программы. Программа загружает воперативную память всюиспользуемую dll. Несколько программ работаетс одной dll одновременно. Маленький размер программ Требует наличие dll в ОС. Возможно обновление версииdll без перекомпиляциипрограммы.Статические библиотеки Динамические библиотеки
  7. 7. Рекомендации Если библиотека редкая или нестандартная,лучше использовать статическую компоновкупрограммы. Если библиотека широко распространена илистандартная, то рекомендуется использоватьдинамическую компоновку программы. Желательно создавать обе версии библиотек: идинамическую, и статическую.
  8. 8. Разработка библиотек программированияРазработкапохожа наразработкуобычногоприложения
  9. 9. Статические библиотеки:заголовочные файлы#ifndef _GEOMETRY_H_#define _GEOMETRY_H_struct point{double x, y;point();point(double, double);};struct line{double a, b, c;line();line(double, double, double);};#endifЗаголовочные файлы должны бытьзащищены от повторного включениядирективами препроцессора:#ifndef A_CONSTANT#define A_CONSTANT#endifMicrosoft VC++ (+ Intel Compiler)позволяют использовать директиву#pragma once
  10. 10. Статические библиотеки: исходники#include "geometry.h"point::point(): x(0), y(0) {}point::point(double p1, double p2): x(p1), y(p2) {}line::line(): a(0), b(0), c(0) {}line::line(double p1, double p2, double p3): a(p1), b(p2), c(p3) {}Исходные файлы пишутся как обычно, без всяких особенностей
  11. 11. Динамические библиотеки:заголовочные файлы#ifndef _GEOMETRY_H_#define _GEOMETRY_H_#define DLLEXPORT __declspec(dllexport)struct DLLEXPORT point{double x, y;point();point(double, double);};struct DLLEXPORT line{double a, b, c;line();line(double, double, double);bool contains(const point&) const;};DLLEXPORT bool contains(const line&, const point&);#endifДобавляется указание(макрос) на экспортструктур и функцийCpp файлы остаютсянеизменными
  12. 12. Динамические библиотеки:файлы определения модулейИспользуются дляопределения функций наэкспорт вместо__declspec(dllexport)MODULE mylibEXPORTSmin @1isPrime @2nope @3 ; no operation
  13. 13. Динамические библиотеки:точка входа Динамические библиотеки могут иметьточку входа (использует windows.h).BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}
  14. 14. Использование библиотекпрограммирования Статическая линковка Динамическое неявное связывание Динамическое явное связываниеЛинковка статических библиотек инеявное связывание динамическихбиблиотек совпадают пореализации.
  15. 15. Статическая линковкаgeometry.hgeometry.libСкопировать заголовочный файлв папку include, библиотеку в lib
  16. 16. Подключение библиотекипользователяУказатьотносительный /абсолютный путь дозаголовочного файла.Указать в свойствахпуть до библиотеки
  17. 17. Подключение библиотеки припомощи комментария компилятору#include "../geometry/geometry.h"#pragma comment(lib, "../Debug/Geometry.lib")#include <iostream>int main(){plane::point p(1, 0), p2(1, 2);//plane::line l(1, -1, 0);//std::cout << l.contains(p);std::cout << "distance from " << p << " and " << p2 << " is "<< plane::distance(p, p2) << std::endl;return 0;}
  18. 18. Явное связывание Windows.h HMODULE WINAPI LoadLibrary(LPCTSTRlpFileName); BOOL WINAPI FreeLibrary(HMODULE hModule); FARPROC WINAPI GetProcAddress(HMODULEhModule, LPCSTR lpProcName);
  19. 19. Явное связывание#include <Windows.h>#include <iostream>int main(){HMODULE hMdl = LoadLibrary(L"geometry");if(hMdl != NULL){std::cout << "Library geometry is loaded" << std::endl;}else{std::cout << "Library geometry is not loaded" << std::endl;}return 0;} Загрузка библиотеки в нужныймомент при помощи функцииLoadLibrary Используется WinAPI (заголовочный файл windows.h)
  20. 20. Использование функции из dllБиблиотеку dll, загружаемую припомощи LoadLibrary, можноиспользовать без библиотекиимпорта.Пусть в mymath.dll определеныфункции:#pragma oncetypedef unsigned long long u64;u64 factorial(u64);bool isSimple(u64);#include <Windows.h>#include <iostream>typedef bool (*pfunc)(unsigned long long);int _tmain(int argc, _TCHAR* argv[]){HMODULE hMdl = LoadLibrary(L"mymath");if(hMdl != NULL){std::cout << "library is loaded" << std::endl;pfunc IsPrime = (pfunc)GetProcAddress(hMdl, "isSimple");if(IsPrime != NULL)std::cout << "number " << 997 << " is "<<(IsPrime(997) ? "prime" : "composed")<<std::endl;elsestd::cout << "function not found" << std::endl;} else{std::cout << "error library loading" << std::endl;}return 0;}
  21. 21. Ресурсы из dll Windows.h LPTSTR MAKEINTRESOURCE(WORDwInteger); HRSRC WINAPI FindResource(HMODULEhModule, LPCTSTR lpName, LPCTSTR pType); HGLOBAL WINAPI LoadResource(HMODULEhModule, HRSRC hResInfo); HBITMAP LoadBitmap(HINSTANCE hInstance,LPCTSTR lpBitmapName); int WINAPI LoadString(HINSTANCE hInstance,UINT uID, LPTSTR lpBuffer, int nBufferMax);
  22. 22. Ресурсы из dll
  23. 23. Использование ресурса из dll#include <Windows.h>#include <iostream>int _tmain(int argc, _TCHAR* argv[]){HMODULE hMdl = LoadLibrary(L"mymath");if(hMdl != NULL){LPTSTR str = new wchar_t[1024];LoadString(hMdl, 101, str, 1024);MessageBox(NULL, str, 0, 0);}else{std::cout << "error library loading" << std::endl;}return 0;}Поиск ресурса осуществляетсяпо идентификатору

×