Содержание

 

Введение

1 Компиляция программ на языке C/C++

2 Компиляция нескольких файлов

3 Создание библиотек объектных файлов

3.1 Библиотеки объектных файлов

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

3.3 Создание динамической библиотеки

3.4 Использование динамических библиотек

4 Создание динамических библиотек

4.1 Функции работы с динамическими библиотеками

4.2 Создание динамической библиотеки для решения системы линейных уравнений

Выводы

Список использованной литературы


Введение

 

Простые программы обычно состоят из одного исходного файла. Но если программы становится большой, ее рекомендуется их разбивать на куски, которые функционально ограничены и закончены. Так как процесс правки при большом исходном тексте становится сложным и поиск небольшой ошибки может повлечь за собой вынужденное "изучение" кода заново. Также большой файл программы увеличивает время компиляции.

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

Библиотека объектных файлов - это файл содержащий несколько объектных файлов, которые будут использоваться вместе в стадии линковки программы. Библиотека содержит символьный индекс, который состоит из названий функций и переменных и т.д., которые содержатся в библиотеке. Это позволяет ускорить процесс линковки программы, так как поиск функций и переменных в объектных файлах библиотеки происходит намного быстрее, чем поиск в наборе указанных объектных файлов.

Поэтому использование библиотеки позволяет компактно хранить все требуемые объектные файлы в одном месте, и при этом значительно повысить скорость компиляции.

В курсовой работе приведены примеры создания и использования статических и динамических библиотек. Д разработано несколько простых динамических библиотек (возведение числа в степень и решение системы линейных уравнений)

 


1 Компиляция программ на языке C/C++

Компилятор превращает код программы на "человеческом" языке в объектный код понятный компьютеру. Компиляторов под Linux существует много, практически для каждого распространенного языка. Большинство самых востребованных компиляторов входит в набор GNU Compiler Collection, известных под названием GCC (http://gcc.gnu.org/).

Изначально аббревиатура GCC имела смысл GNU C Compiler, но в апреле 1999 года сообщество GNU решило взять на себя более сложную миссию и начать создание компиляторов для новых языков с новыми методами оптимизации, поддержкой новых платформ, улучшенных runtime-библиотек и других изменений (http://gcc.gnu.org/gccmission.html). Поэтому сегодня коллекция содержит в себе компиляторы для языков C, C++, Objective C, Chill, Fortran, Ada и Java, как библиотеки для этих языков (libstdc++, libgcj, ...).

Компиляция программ производится командой:

gcc <имя_файла>

После этого, если процесс компиляции пройдет успешно, то вы получите загружаемый файл a.out, запустить который можно командой:

./a.out

Для примера давайте напишем маленькую простейшую программку:

#include <stdio.h>

int main(){

printf("[http://linux.firststeps.ru]\n");

printf("Our first program for Linux.\n");

return 0;

};


2 Компиляция нескольких файлов

Обычно простые программы состоят из одного исходного файла. Дело обстоит несколько сложнее, если эта программа становится большой. При работе с такой программой может возникнуть несколько достаточно серьезных проблем:

Файл, становясь большим, увеличивает время компиляции, и малейшие изменения в исходном тексте автоматически вынуждают тратить время программиста на перекомпиляцию программы.

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

Процесс правки и само ориентирование при большом исходном тексте становится сложным и поиск небольшой ошибки может повлечь за собой вынужденное "изучение" кода заново.

Это далеко не все пробемы, которые могут возникнуть при наличии программы "монстра". Поэтому при разработке программ рекомендуется их разбивать на куски, которые функционально ограничены и закончены. В этом значительно помогает сам язык C++, предоставляя свой богатый синтаксис.

Для того, чтобы вынести функцию или переменную в отдельный файл надо перед ней поставить зарезервированное слово extern. Для примера создадим программу из нескольких файлов. Сначала создадим главную программу, в которой будут две внешние процедуры. Назовем этот файл main.c:

#include <stdio.h>

// описываем функцию f1() как внешнюю

extern int f1();

// описываем функцию f2() как внешнюю

extern int f2();

int main()

{

int n1, n2;

n1 = f1();

n2 = f2();

printf("f1() = %d\n",n1);

printf("f2() = %d\n",n2);

return 0;

}

Теперь создаем два файла, каждый из которых будет содержать полное определение внешней функции из главной программы. Файлы назовем f1.c и f2.c:

// файл f1.c

int f1()

{

return 2;

}

// файл f2.c

int f2()

{

return 10;

}

После этого процесс компиляции программы с помощью gcc будет выглядеть несколько иначе от описанного в первой главе "Компиляция программ на языке C/C++".

Компилировать можно все файлы одновременно одной командой, перечисляя составные файлы через пробел после ключа -c:

gcc -c main.c f1.c f2.c

Или каждый файл в отдельности:

gcc -c f1.c

gcc -c f2.c

gcc -c main.c

В результате работы компилятора мы получим три отдельных объектных файла:

main.o

f1.o

f2.o

Чтобы их собрать в один файл с помощью gcc надо использовать ключ -o, при этом линкер соберет все файлы в один:

gcc main.o f1.o f2.o -o rezult

В результате вызова полученной программы rezult командой:

./rezult

На экране появится результат работы:

olya:~# ./rezult

f1() = 2

f2() = 10

olya:~#

Теперь, если мы изменим какую-то из процедур, например f1():

int f1()

{

return 25;

}

То компилировать заново все файлы не придется, а понадобится лишь скомпилировать измененный файл и собрать результирующий файл из кусков:

olya:~# gcc -c f1.c

olya:~# gcc main.o f1.o f2.o -o rezult2

olya:~# ./rezult2

f1() = 25

f2() = 10

olya:~#

Таким образом можно создавать большие проекты, которые больше не будут отнимать много времени на компиляцию и поиск ошибок. Однако нужно помнить, что не стоит также черезчур разбивать программу, иначе у нас получится несколько десятков файлов, в которых рано или поздно можно запутаться. Можно найти "золотую середину", например в отдельные файлы помещать те функции или классы, с которыми нам приходится больше всего работать при отладке. После того, как функция будет окончательно отлажена, ее вполне можно перенести в более крупный файл.



Информация о работе «Разработка статических и динамических библиотек на языке программирования С/C++ в операционных системах UNIX»
Раздел: Информатика, программирование
Количество знаков с пробелами: 29985
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
257667
0
26

... их интеграция, расширение их возможностей в новых версиях, создание новых средств и перенос их на другие аппаратные платформы и в другие ОС IBM. 12.4 Операционная система z/VM ОС z/VM [21, 24, 42] (последняя версия - V4R2) является высокопроизводительной многопользовательской интерактивной ОС, предоставляющей уникальные возможности в части выполнения различных операционных сред на одном ...

Скачать
148576
34
0

... элементов, глобальное пространство имен, а также лавинообразную первоначальную загрузку сети. Таким образом ОСРВ SPOX имеет необходимые механизмы для создания отказоустойчивой распределенной операционной системы реального времени, концепция построения которой описана в главе 2. 4.3 Аппаратно-зависимые компоненты ОСРВ Модули маршрутизации, реконфигурации, голосования реализованы как аппаратно- ...

Скачать
40710
0
0

... заимствуются из стандартной библиотеки Си. Кроме того, существует огромное количество библиотек Си++, не входящих в стандарт. В программах на Си++ можно использовать многие библиотеки Си. Стандартизация определила язык программирования Си++, однако за этим названием могут скрываться также неполные, ограниченные, достандартные варианты языка. В первое время язык развивался вне формальных рамок, ...

Скачать
83100
0
1

... (САПР) и пр.; -           ПС, используемые в обучении – электронные учебники, тренажеры, тесты и пр.; -           игровые программы; -           программы, созданные пользователем с помощью сред программирования. Еще один класс программного обеспечения – специальное ПО. Основное его отличие от системного ПО в том, что пользователь сам решает, будет ли он использовать эти ПС или нет, а отличие ...

0 комментариев


Наверх