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

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

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

Как только библиотека создана, мы можем использовать код, которые она содержит, как если бы мы были компилировали исходный код непосредственно с нашей программой.

Ниже приводится простой пример создания статической библиотеки с помощью этих трех файлов:
  • mylib.bas - исходный код для библиотеки
  • mylib.bi - заголовок для библиотеки
  • mytest.bas - тестовая программа

Наша библиотека будет иметь один модуль, обеспечивающий одну функцию:

'' mylib.bas
'' компилировать: fbc -lib mylib.bas

'' Сложить два числа и возвратить результат
Public Function Add2( ByVal x As Integer, ByVal y As Integer ) As Integer
  Return( x + y )
End Function

Компиляция библиотеки:
fbc -lib mylib.bas

Опция -lib говорит компилятору о том, что надо взять исходный код mylib.bas, и превратить его в объектный файл mylib.o, а затем сохранить файл объекта в файл библиотеки, которая также называется архивом libmylib.a. Библиотека может содержать множество модулей (исходных файлов), каждый модуль может иметь множество функций, но для этого простого примера, мы использовали один модуль.

Чтобы использовать библиотеку в каком-то другом исходном коде, мы должны каким-то образом сообщить компилятору, что именно в библиотеке. Хороший способ сделать это: положить декларации (также называемые интерфейс или API) для библиотеки в файл заголовка.

'' mylib.bi
#inclib "mylib"
Declare Function Add2( ByVal x As Integer, ByVal y As Integer ) As Integer

Нет необходимости писать это в заголовке. Мы можем использовать данную запись и в исходном коде нашей программы. Заголовок же поможет избежать лишнего кода, если данную библиотеку нужно будет включить и для других исходных файлов. Заявление #inclib сообщит компилятору имя статической библиотеки, с которой в конце концов надо связать нашу программу для создания конечного исполняемого файла.

С нашей библиотекой (файл .a) и заголовком (.bi файл),  мы можем попробовать их в тестовом примере:

'' mytest.bas
'' компилировать: fbc mytest.bas
#include once "mylib.bi"
Print Add2(1,2)

Оператор #include сообщает компилятору включить исходный код mylib.bi так, как если бы мы ввели его содержимое в исходном источнике. То есть все что мы в нем написали (запись о библиотеке) будет передана компилятору.

Компилировать так:
fbc mytest.bas

Затем, когда мы запускаем наш исполняемый файл mytest, мы должны получить результат:
3

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

Библиотеки могут по желанию содержать отладочную информацию, указанную с опцией -g командной строки.

Объектные файлы, и библиотеки, являются платформозависимыми, а в некоторых случаях конкретизируются для определенной версии компилятора и FreeBASIC RinTime.

См. также