Компоновка библиотеки

На верх  Назад  Вперёд

Процесс компоновки вашей программы в библиотеку зависит от того, как вы объявляете внешнюю процедуру.

В том случае, если вы используете следующий синтаксис объявления процедуры:

Procedure ProcName (Args : TPRocArgs); external 'Name';

Вам нет необходимости предпринимать какие-либо дополнительные действия для компоновки вашего файла, компилятор сделает всё что нужно вместо вас. На WINDOWS будет скомпонован файл с именем name.dll, на LINUX и других UNIX-подобных системах ваша программа будет скомпонована в библиотеку libname, которая может быть статической или динамической библиотекой.

В случае использования

Procedure ProcName (Args : TPRocArgs); external;

Вам необходимо указать точную ссылку на библиотеку. Это можно сделать двумя путями:

1.Вы можете указать компилятору в исходном файле библиотеку для компоновки, используя директиву

{$LinkLib 'Name'}:
{$LinkLib 'gpm'}

Это будет ссылка на библиотеку gpm. На UNIX системах (таких как LINUX ), вы не должны указывать расширение или префикс библиотеки 'lib'. Компилятор позаботится об этом. На других системах (таких как WINDOWS ), вам необходимо указать полное имя.

2.Вы также можете указать компилятору ссылку на библиотеку в командной строке: для этого можно использовать опцию -k. Например

ppc386 -k'-lgpm' myprog.pp

Это эквивалентно описанному выше методу, указывает компоновщику компоновать библиотеку gpm.

В качестве примера рассмотрим следующую программу:

program printlength;
{$linklib c} { Чувствительно к регистру }
 
{ Объявление для стандартной функции C strlen }
Function strlen(P : pchar) : longint; cdecl; external;
begin
  Writeln(strlen('Программирование – это легко!'));
end.

Эта программа может быть скомпилирована с

ppc386 prlen.pp

Предполагая, конечно, что исходный текст программы находится в prlen.pp.

Для использования функций в C, которые имеют меняющееся количество параметров, вы должны компилировать ваш модуль или программу в режимах objfpc или Delphi, и использовать параметр Array of const, как это показано в следующем примере:

program testaocc;
{$mode objfpc}
 
Const
  P : Pchar
        = 'example';
  F : Pchar
        = 'This %s uses printf to print numbers (%d) and strings.'#10;
 
procedure printf(fm: pchar; args: array of const); cdecl; external 'c';
begin
  printf(F,[P, 123]);
end.

Результат этой программы будет подобен следующему:

This example uses printf to print numbers (123) and strings.

В качестве альтернативы программа может иметь следующую конструкцию:

program testaocc;
 
Const
P : Pchar =
        'example';
F : Pchar =
        'This %s uses printf to print numbers (%d) and strings.'#10;
 
procedure printf(fm: pchar); cdecl; varargs; external 'c';
begin
  printf(F, P, 123);
end.

Модификатор varargs сигнализирует компилятору, что функция позволяет меняющееся количество параметров (обозначается многоточием в С ).