русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Шаг 9 - Инициализация динамических библиотек


Дата добавления: 2015-07-04; просмотров: 615; Нарушение авторских прав


До сих пор мы писали с Вами простые динамические библиотеки, поэтому у нас не болела голова об инициализации внутренних переменных. А представьте себе более сложную ситуацию, когда функции библиотеки для работы требуют правильно инициализированные переменные. Ну, например, для работы функции нужен буфер или массив.

Специально для таких случаев в библиотеках можно задавать инициализирующую и деинициализирующую функции:

· void _init() - инициализация

· void _fini() - деинициализация

Чтобы понять, что к чему, введем в нашей библиотеке lib.c переменную test и возвращающую ее функцию:

char *test; char *ret_test(){ return test;};

Пишем основную программу main.c. Она очень похожа на предыдущий наш проект, поэтому можете его модифицировать:

#include <stdio.h>#include <dlfcn.h> int main(){ void *ext_library; double value=0; char * (*ret_test)(); ext_library = dlopen("libtest.so",RTLD_LAZY); if (!ext_library){ fprintf(stderr,"dlopen() error: %s\n", dlerror()); return 1; }; ret_test = dlsym(ext_library,"ret_test"); printf("Return of ret_test: \"%s\" [%p]\n",(*ret_test)(),(*ret_test)()); dlclose(ext_library);};

После компиляции всего этого хозяйства мы получим результат:

dron:~# gcc -c lib.c -fPICdron:~# gcc -shared lib.o -o libtest.sodron:~# gcc -o main main.c -ldldron:~# ./mainReturn of ret_test: "(null)" [(nil)]dron:~#

Как видите переменная test оказалась равной NULL, а нам бы хотелось нечто другое. Ну, так давайте посмотрим как работают функции _init() и _fini(). Создадим вторую библиотеку lib1.c:

#include <stdlib.h> char *test; char *ret_test(){ return test;}; void _init(){ test=(char *)malloc(6); if (test!=NULL){ *(test+0)='d'; *(test+1)='r'; *(test+2)='o'; *(test+3)='n'; *(test+4)='!'; *(test+5)=0; }; printf("_init() executed...\n");}; void _fini(){ if (test!=NULL) free(test); printf("_fini() executed...\n");};

Теперь пробуем компилировать:



dron:~# gcc -c lib1.c -fPICdron:~# gcc -shared lib1.o -o libtest.solib1.o: In function `_init':lib1.o(.text+0x24): multiple definition of `_init'/usr/lib/crti.o(.init+0x0): first defined herelib1.o: In function `_fini':lib1.o(.text+0xc0): multiple definition of `_fini'/usr/lib/crti.o(.fini+0x0): first defined herecollect2: ld returned 1 exit statusdron:~#

Опаньки... Облом. Что же это такое ?! Оказывается кто-то уже использовал эти функции до нас и программа не может слинковаться. После долгого копания в нескольких чужих исходниках я получил ответ на этот вопрос. Оказывается, чтобы избавиться от мешающей библиотеки надо использовать ключ компилятора -nostdlib. Попробуем:

dron:~# gcc -shared -nostdlib lib1.o -o libtest.sodron:~#

Смотрите-ка, все прекрасно скомилировалось. Теперь попробуем запустить main:

dron:~# ./main_init() executed...Return of ret_test: "dron!" [0x8049c20]_fini() executed...dron:~#

Ну как ? Помоему классно. Теперь можно спокойно создавать для работы библиотеки правильно инициализированные переменные. Однако классные эти штуки - динамические библиотеки ! А Вы что хотели ? Тот же Windows только на своих DLL и живет. А Linux ничем не хуже...



<== предыдущая лекция | следующая лекция ==>
Шаг 8 - Функции работы с динамическими библиотеками | Шаг 10 - Передача опций в программу - getopt


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.335 сек.