12.2. Создание библиотеки

Вверх  Предыдущий  Следующий

Создание библиотек поддерживается в любом режиме компилятора Free Pascal, но может случиться так, что значения аргументов или возвращаемых результатов будут отличаться, если библиотека скомпилирована в двух разных режимах. Например, если ваша функция принимает целочисленный аргумент (типа Integer), то библиотека будет принимать целые числа разных размеров, если вы компилируете её в режимах Delphi или TP.

Библиотека создаётся как программа, только используется ключевое слово library, и имеется раздел exports. В следующем листинге приведён пример простой библиотеки:

Листинг: progex/subs.pp

{ Пример библиотеки }
 
library subs;
 
function SubStr (CString : PChar; FromPos, ToPos : Longint) : PChar; cdecl;
var
  Length : Integer;
begin
  Length : = StrLen(CString);
  SubStr : = CString + Length;
  if (FromPos > 0) and (ToPos >= FromPos) then
    begin
      if Length >= FromPos then
      SubStr : = CString + FromPos - 1;
      if Length > ToPos then CString[ToPos] : = #0;
    end;
end;
 
exports
SubStr;
end.

Функция SubStr не должна быть объявлена в файле самой библиотеки. Она может быть объявлена в разделе интерфейса (interface) модуля, который используется библиотекой.

В результате компиляции этого исходного кода будет создана библиотека с именем libsubs.so для UNIX-систем, или subs.dll для WINDOWS или OS/2. Компилятор сам позаботится о создании всех дополнительных связей, которые требуются для создания общедоступной библиотеки.

Библиотека экспортирует одну функцию: SubStr. Это важный момент. В том случае, когда функция имеется в разделе exports, она будет экспортироваться.

Если вы хотите, чтобы ваша функция вызывалась из программы, созданной с помощью другого компилятора, важно соблюдать правильность соглашения о вызовах для экспортируемых функций. Так как программы, созданные с помощью других компиляторов, не знают о соглашениях о вызовах Free Pascal, ваша функция будет вызвана неправильно, в результате чего будет повреждён стек.

В WINDOWS большинство библиотек используют соглашение о вызовах stdcall, так что может быть лучше использовать именно его, если ваша библиотека будет работать в системах WINDOWS. В большинстве систем UNIX используется соглашения о вызовах C, поэтому следует использовать модификатор cdecl.