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