48683 (Разработка статических и динамических библиотек на языке программирования С/C++ в операционных системах UNIX), страница 3
Описание файла
Документ из архива "Разработка статических и динамических библиотек на языке программирования С/C++ в операционных системах UNIX", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "48683"
Текст 3 страницы из документа "48683"
if (!ext_library){
//если ошибка, то вывести ее на экран
fprintf(stderr,"dlopen() error: %s\n", dlerror());
return 1;
};
//загружаем из библиотеки требуемую процедуру
powerfunc = dlsym(ext_library, argv[1]);
value=3.0;
//выводим результат работы процедуры
printf("%s(%f) = %f\n",argv[1],value,(*powerfunc)(value));
//закрываем библиотеку
dlclose(ext_library);
};
Код главной программы готов. Требуется его откомпилировать с использованием библиотеки dl:
olya:~# gcc main.c -o main -ldl
Получим программный файл main, который можно тестировать. Наша программа должна возводить значение 3.0 в требуемую нами степень, которая задается названием функции. Давайте попробуем:
olya:~# ./main power2
power2(3.000000) = 9.000000
olya:~# ./main power3
power3(3.000000) = 27.000000
olya:~# ./main power4
power4(3.000000) = 81.000000
olya:~#
Мы используем функции, зная лишь их название. Представьте открывающиеся возможности для программ, на основе этого метода можно создавать плагины для программ, модернизировать какие-то части, добавлять новые возможности и многое другое.
4.2 Создание динамической библиотеки для решения системы линейных уравнений
В качестве примера использования динамических библиотек напишем программу для решения системы линейных уравнений.
Пусть система имеет вид:
a11*x1+a12*x2=b1;
a21*x1+a22*x2=b2;
Решение этой системы находим через обратную матрицу A-1.
A*X=B
X=A-1*B
; ; ;
;
Программа в качестве параметров принимает значение коефициентов системы и название функции, которую она использует.
Создадим динамическую библиотеку:
Так как функция возвращает два результата x1 и x2 в программе будем использовать структуру.
"mytype.h" :
struct DPair {
double first;
double second;
};
Struct DPair (*powerfunc)(double,double,double,double,double,double);
"libsysur.c" :
#include "mytype.h"
struct DPair sys2(double a11, double a12,double a21, double a22,double b1, double b2){
//nahodim opredelitel sistemy
struct DPair dPair;
double opr=a11*a22-a12*a21;
if (opr!=0) {
double ao11=a22; double ao12=-a21;
double ao21=-a12; double ao22=a11;
dPair.first=(ao11*b1+ao21*b2)/opr;
dPair.second=(ao12*b1+ao22*b2)/opr;
}
return dPair;
}
Создаем динамическую библиотеку libsysur.so следующими командами:
bash-3.00# gcc -fPIC -c libsysur.c
bash-3.00# gcc -shared libsysur.o -o libsysur.so
Создаем основную программу:
"sysur.c" :
#include
#include
#include "mytype.h"
int main(int argc, char* argv[]){
void *ext_library; //хандлер внешней функции
double a11;double a12; double a21; double a22;
double b1; double b2;
double (*powerfunc)(double a11,double a12, double a21, double a22,double b1, double b2);//переменная, для хранения адреса функции
//загрузка библиотеки
ext_library=dlopen("/root/dynamik/libsysur.so",RTLD_LAZY);
if (!ext_library){
//если ошибка, вывести на экран
fprintf(stderr,"dlopen() error: %s\n", dlerror());
return 1;
};
//загружаем из библиотеки требуемую процедуру
powerfunc=dlsym(ext_library, argv[1]); //получаем адрес требуемой функции
//ext_library-адрес загруженной библ.
//argv-требуемая функция или переменная
printf("Vvedite a11 a12 :");
scanf("%lf %lf",&a11,&a12);
printf("Vvedite a21 a22 :");
scanf("%lf %lf",&a21,&a22);
printf("Vvedite b1, b2 :");
scanf("%lf %lf",&b1,&b2);
struct DPair sq=(*powerfunc)(a11,a12,a21,a22,b1,b2);
printf("x1=%lf\n, x2=%d\lf",sq.first,sq.second);
//выводим результат работы процедуры
//закрываем библиотеку
dlclose(ext_library);
};
Компилируем код главной программы:
bash -3.00# gcc sysur.c -o sysur -ldl
Выводы
В курсовой работе были рассмотрены рассмотрены вопросы разработки статических и динамических библиотек на языке программирования С/C++ в операционных системах UNIX.
Использование библиотеки позволяет компактно хранить все требуемые объектные файлы в одном месте, и при этом значительно повысить скорость компиляции.
Объектные библиотеки по способу использования разделяются на статические и динамические библиотеки
Статическая библиотека - это коллекция объектных файлов, которые присоединяются к программе во время линковки программы. В работе самой программы статические библиотеки они не принимают участие, в отличие от динамических библиотек.
В динамической библиотеке объектные файлы из библиотеки не присоединяются к программе. Присоединение этих объектных файлов осуществляет системный динамический загрузчик во время запуска программы. Загрузчик проверяет все библиотеки прилинкованные с программе на наличие требуемых объектных файлов, затем загружает их в память и присоединяет их в копии запущенной программы, находящейся в памяти.
Динамические библиотеки немного лучше статических, но их использование более сложное. Так как динамическая библиотека это уже не архивный файл, а настоящая загружаемая программа
Список использований литературы
-
http://club.shelek.com/
-
http://helpsite.narod.ru/
-
http://myforum.net.ua/index.php?
-
http://ishodniki.ru/
-
Робин Бурк и др. Unix для системных администраторов.Энциклопедия пользователя. - Киев 1998. - 864с.