Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Создание динамической библиотеки для решения системы линейных уравнений ⇐ ПредыдущаяСтр 2 из 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 < stdio.h> #include < dlfcn.h> #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. Использование библиотеки позволяет компактно хранить все требуемые объектные файлы в одном месте, и при этом значительно повысить скорость компиляции. Объектные библиотеки по способу использования разделяются на статические и динамические библиотеки Статическая библиотека - это коллекция объектных файлов, которые присоединяются к программе во время линковки программы. В работе самой программы статические библиотеки они не принимают участие, в отличие от динамических библиотек. В динамической библиотеке объектные файлы из библиотеки не присоединяются к программе. Присоединение этих объектных файлов осуществляет системный динамический загрузчик во время запуска программы. Загрузчик проверяет все библиотеки прилинкованные с программе на наличие требуемых объектных файлов, затем загружает их в память и присоединяет их в копии запущенной программы, находящейся в памяти. Динамические библиотеки немного лучше статических, но их использование более сложное. Так как динамическая библиотека это уже не архивный файл, а настоящая загружаемая программа Список использований литературы 1. http: //club.shelek.com/ 2. http: //helpsite.narod.ru/ 3. http: //myforum.net.ua/index.php? 4. http: //ishodniki.ru/ 5. Робин Бурк и др. Unix для системных администраторов.Энциклопедия пользователя. - Киев 1998. - 864с.
|
Последнее изменение этой страницы: 2019-10-04; Просмотров: 131; Нарушение авторского права страницы