Раздельная компиляция и статические библиотеки.

GCC поддерживает раздельную компиляцию и не требует при этом специальных указаний от пользователя. Далее будет принято что файл main.c содержит исходный текст основной программы, файлы first.c, second.c - исходные тексты используемых в основной программе внешних функций, а файлы first.h и second.h - соответствущие им заголовочные файлы, подключённые в файле main.c. Для начала с помощью команды gcc -c создадим из исходных файлов объектные. Затем применив команду gcc -o main.exe main.o first.o second.o можно объединить три ранее созданных объектных файла в один исполняемый файл main.exe.

Теперь расмотрим процесс создания статичной библиотеки. Для этого потребуется заголовочный файл hworld.h, содержащий прототипы функций из first.c и second.c. Данный заголовочный файл будет подключён в файле main.c. Выполним следующую последовательность команд:

gcc -c first.c

gcc -c second.c

C:\dev-cpp\bin\ar crs libhworld.a first.o second.o

Результатом выполнения программы ar будет создание библиотеки libhworld.a, содержащей объектные файлы first.o и second.o. Для программы ar заданы следующие опции:

Опция c arname - создать архив, если архив с именем arname не существует он будет создан, в противном случае файлы будут добавлены к имеющемуся архиву.

Опция r - задает режим обновления архива, если в архиве файл с указанным именем уже существует, он будет удален, а новый файл дописан в конец архива.

Опция s - добавляет (обновляет) индекс архива. Индекс архива необходим для ускорения работы с библиотекой - для того чтобы найти нужное определение, отпадает необходимость просматривать таблицы символов всех файлов архива, можно сразу перейти к файлу, содержащему искомое имя.

Для компиляции с использованием библиотеки используется следующая команда:

gcc -o main main.o -L. -lhworld

Опция -lname позволяет подключить библиотеку с именем libname , в описанном случае в качестве name указано hworld, такое же имя должен иметь подключаемый заголовочный файл.

Опция -L <путь> передаёт путь к библиотеке, в описанномслучае -L. показывает что искать следует в каталоге с исходным текстом.

 

 

Задания к лабораторной работе .

Часть I

1. Написать программу в соответствии с вариантом при помощи любого текстового редактора.

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

3. Провести оптимизацию кода написанной программы с помощью набора компиляторов GCC, пояснить внесённые для оптимизации кода изменения.

Часть II

4. Написать программы в соответствии с вариантом при помощи любого текстового редактора, функции для работы с массивом вынести в отдельные файлы - в одном файле описать функции для ввода/вывода массива, в другом - для обработки массива, в обоих программах должны использоваться одни и те же функции для ввода/вывода массивов, описанные в одном из этих файлах.

5. Провести раздельную компиляцию написанных файлов.

6. Скомпилировать обе программы, используя созданные объектные файлы, обе программы должны использовать один и тот же объектный файл с функциями для ввода/вывода массива.

7. Создать статическую библиотеку для ввода/вывода массива и продемонстрировать возможности по её подключению.

 

Варианты к заданию.

 

Вариант 1

1. Дано натуральное n. Вычислить n сомножителей произведения

2. Сформировать новый массив из элементов массива М (25), встречающихся в этом массиве только один раз.

3. Определить, представляют ли собой элементы массива А (20) возрастающую последовательность.

Вариант 2

1. Определить количество натуральных трехзначных чисел, сумма цифр которых равна заданному числу N.

2. Записать элементы массива С (20) в обратном порядке {С201918;…;С21}. Вспомогательный массив не использовать.

3. Вставить число 100 после второго положительного элемента массива А (15).

Вариант 3

1. Дано натуральное число N. Составить программу для сравнения цифр старшего и младшего разрядов этого числа.

2. Определить количество элементов массива М (22), больших среднего арифметического значения элементов этого массива.

3. В массиве А (45) найти локальные максимумы, определить их местоположение. Локальным максимумом назовем элемент массива, значение которого больше, чем значения двух соседних с ним элементов.

Вариант 4

1. Дано натуральное число N. Составить программу для определения количества цифр в этом числе

2. Найти 2 первых элемента в массиве С (17), значения которых не попадают в заданный с клавиатуры диапазон [A, B]. Поменять их местами.

3. В массиве А (35) найти минимум, определить его местоположение (с учетом возможного повторения).

Вариант 5

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

2. Удалить из массива М (25) все элементы, значения которых в этом массиве повторяются, оставив по одному.

3. Вычислить сумму отрицательных элементов массива D (19), кратных четырем.

Вариант 6

1. Найти сумму целых положительных чисел из промежутка от А до В, кратных 4. Значения А и В вводятся с клавиатуры.

2. Поменять местами максимальный отрицательный и первый положительный элементы массива В (18).

3. Вставить число 0 в середину массива М (20), предварительно сдвинув вправо значения элементов массива, начиная с 11-го.

Вариант 7

1. Для натурального числа N получить все его натуральные делители.

2. Вычислить сумму элементов массива М (15), значения которых лежат в введенном с клавиатуры диапазоне [X, Y].

3. Удалить из массива А (20) первый отрицательный элемент.

Вариант 8

1. Сумма цифр трехзначного числа кратна 7, само число также делится на 7. Найти все такие числа.

2. Поменять местами максимальный и последний отрицательный элементы массива А (40).

3. Сформировать новый массив из элементов заданного целочисленного массива М (50), кратных 7 или содержащих в записи числа цифру 7.

Вариант 9

1. Дано натуральное N. Составить программу для поиска первой цифры этого числа.

2. Удалить из массива М (26) первый положительный элемент.

3. Заменить все четные элементы массива А (20) на их квадраты, а нечетные удвоить.

Вариант 10

1. Среди четырехзначных чисел выбрать те, у которых все 4 цифры различны.

2. Удалить из массива В (50) все элементы, кратные 3 или 5.

3. Определить, есть ли в массиве Q (10) заданное число Х, и если нет, то найти ближайшее к нему.

Вариант 11

1. Поменять местами цифры старшего и младшего разрядов данного натурального числа (например, из числа 3879 получится 9873).

2. Найти сумму элементов массива А (45), находящихся между максимальным и минимальным значениями.

3. Сформировать новый массив из положительных нечетных элементов заданного массива Р (20).

Вариант 12

1. Ввести натуральные числа А и В. Определить все числа, кратные А и В, меньшие А*В.

2. Определить местоположение элементов массива А (30), не встречающихся в массиве В (15).

3. Найти сумму четных элементов массива М (15), имеющих четные индексы.

Вариант 13

1. Определить, являются ли натуральные числа А и В взаимно простыми. Взаимно простые числа не имеют общих делителей, кроме единицы.

2. Определить, есть ли в массиве М (15) пары соседних одинаковых элементов.

3. Найти наибольший отрицательный элемент массива А (23) и удалить его.

Вариант 14

1. Дано натуральное число N. Вычислить S=1+22+33+…+NN. Формулу возведения в степень не использовать.

2. Поменять местами первый и последний отрицательные элементы массива В (18).

3. Определить, является ли массив М (20) перестановкой последовательности натуральных чисел от 1 до 20, т. е. проверить, все ли числа из этого диапазона входят в указанный массив.

Вариант 15

1. Исходное данное - натуральное число K, выражающее площадь. Написать программу для нахождения всех таких прямоугольников, площадь которых равна K и стороны выражены натуральными числами.

2. Дан массив целых чисел В (30). Определить, сколько из них делится на 7 без остатка.

3. Вычислить , где Sп и Sо – суммы положительных и отрицательных элементов массива А (70).

Контрольные вопросы.

1) Что такое GCC и что входит в его состав?

2) Что такое компиляция?

3) Этапы компиляции.

4) Параметры программы gcc.

5) Что происходит при оптимизации кода?

6) Что такое раздельная компиляция?

7) Как создать и использовать статичные библиотеки?

 

Использована статья “О GCC, компиляции и библиотеках“, расположенная по адресу http://pyviy.blogspot.ru/2010/12/gcc.html

Задачи взяты из методического пособия “Основы программирования на языке Си”, составители: Арипова Ольга Владимировна, Бузюкина Ольга Александровна