Статистика
Главная » Статьи » Лабораторные работы » C/C++

Создание статических и динамических библиотек. И использования библиотек в собственных программах.

Поиск в текстовом файле всех слов, заданных в другом текстом файле. Считается что первый файл — файл «словаря», в нем перечислены все слова, которые нужно найти, без повторений.

 

1)                  Создание статической библиотеки

 

Статическая библиотека - это такая библиотека, которая связывается (линкуется) с программой в момент компиляции оной.

Исходный код библиотеки static.c:

#include <stdio.h>

#include <string.h>

extern int search(FILE * in, FILE * text){

int n=-1, k=0;

       char str[100];

       while(feof(in)==0){

           if (fscanf (in, "%s", str)){

                       if(strcmp(str, "")!=0){

                                   n++;

                                   if(strlen(str) > k){

                                              k=strlen(str);

                                   }

                       }

           }

       }

       char dict[n][k+1];

       int count[n];

       int i;

       for (i=0; i<n; i++){count[i]=0;}

       rewind(in);

 

       i=0;

       while( feof(in)==0 ){

            fscanf (in, "%s", dict[i]);

           dict[i][strlen(dict[i])+1]=0;

           i++;

       }

       while (feof(text)==0){

}

           fscanf (text, "%s", str);

           str[strlen(str)+1] = 0;

           for (i=0; i<n; i++){

                       if (strcmp(str, dict[i])==0){

                                   count[i]++;

                       }

           }

           str[0]=0;

       }

       for (i=0; i<n; i++){

           printf ("%s = %d\n", dict[i], count[i]);

       }

}

                        Компилируем библиотеку (толко компиляция):

            gcc -c static.c -o static.o

            Собираем и индексируем библиотеку:

            ar rc lib_MYSTATIC.a static.o

            ranlib lib_MYSTATIC.a

            Исходный текст программы (posl_al.c):

#include <stdio.h>

 

int main (int argc, char** argv){

      FILE *in, *text;

      in = fopen(argv[1], "r");

      text = fopen(argv[2], "r");

 

      if (!in || !text) {

                     printf ("Can't open text or dict. file!\n");

                     return 1;

      }

      search(in, text);

      fclose (in);

      fclose (text);

      return 0;

}

 

Компиляция и линковка программы в том числе с библиотекой:

 

 gcc posl_al.c -L. lib_MYSTATIC.a -o static.out

 

2)      Динамические библиотеки с ранним связыванием

Динамическая библиотека - библиотека, подключаемая к программе в момент выполнения.

Исходный код динамической библиотеки с ранним связыванием (dynamic.c) совпадает с исходным кодом библиотеки со статическим связыванием (static.c).  Исходный код самой программы (posl_al.c) также не требует изменений.

 

            Собираем объектный файл библиотеки:

       gcc -fPIC -c dynamic.c -o dynamic.o

         Получаем из объектного файла динамическую библиотеку:

         gcc -shared -o lib_MYDYNAMIC.so dynamic.o

         Копируем её в папку /usr/lib/:

       sudo cp lib_MYDYNAMIC.so /usr/lib

       ldconfig

                Компилируем итоговую программу:

       gcc posl_al.c -L/usr/lib/ -l_MYDYNAMIC -o dynamic.out

       Все, программа с использованием динамической библиотеки раннего связывания готова. Результат работы:

 

3)      Динамические библиотеки с поздним связыванием

                Ниже приведён изменённый  исходный код программы (posl_al_dyn.c) приминением позднего связывания. Динамическая библиотека используется (_MYDYNAMIC.so) та же что и в предыдущем примере.

#include <stdio.h>

#include <dlfcn.h>

int main (int argc, char** argv){

                FILE *in, *text;

                in = fopen(argv[1], "r");

                text = fopen(argv[2], "r");

                if (!in || !text) {

                               printf ("Can't open text or dict. file!\n");

                               return 1;

                }

                void *handle = dlopen("lib_MYDYNAMIC.so", RTLD_LAZY);

                int (* fun)(FILE *, FILE *) = dlsym(handle, "search");

                (* fun)(in, text);

                dlclose(handle);

                fclose (in);

                fclose (text);

                return 0;

 

}

                   Компиляция программы:

                   gcc -rdynamic -o  dynamic2.out posl_al_dyn.c -ldl

Категория: C/C++ | Добавил: admin (27.01.2015)
Просмотров: 1103 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт