Раздельная компиляция и статические библиотеки.
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) в обратном порядке {С20;С19;С18;…;С2;С1}. Вспомогательный массив не использовать.
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
Задачи взяты из методического пособия “Основы программирования на языке Си”, составители: Арипова Ольга Владимировна, Бузюкина Ольга Александровна