[Comm] Динамические библиотеки в fpc

Rinat Bikov becase на altlinux.org
Ср Июн 8 08:05:18 UTC 2011


8 июня 2011 г. 1:06 Rinat Bikov написал:
> Здравствуйте, уважаемые!
>
> Можете подсказать, можно ли в динамических библиотеках FPC
> использовать функции, описанные в заголовочных файлах C без
> дублирования логики реализации этих функций в паскале?
>
> В частности, сейчас я пытаюсь использовать такую схему:
> есть основное приложение: main, есть функция printString(const char *
> const s), объявленная в заголовочном файле functions.h, реализация
> логики этой функции находится в динамической библиотеке loader.so,
> которая слинкована с main, эта динамическая библиотека сама умеет
> загружать другие динамические библиотеки по пути к ним и вызывать в
> загруженных библиотеках функцию run. В свою очередь из этой функции
> run загруженные динамические библиотеки, созданные на языке C при
> помощи gcc, умеют использовать функцию printString(const char * cons
> s), имея только заголовочный файл functions.h.
>
> А как этого же результата добиться с паскалем и fpc?
>
> На всякий случай присылаю этот тестовый пример, он компилируется при
> помощи команды
> $ make run cmod pmod
>
> На компилирование fpc линкер ругается так:
> /usr/bin/ld: warning: link.res contains output sections; did you forget -T?
> /usr/bin/ld: warning: creating a DT_TEXTREL in a shared object.
>
> Замещать заголовочный файл functions.h пытаюсь следующим func.pas:
> unit func;
> interface
> type
>  printStringT = procedure(s:string); stdcall;
> var
>  printString : printStringT;
> implementation
> exports
>  printString;
> end.
>
> Но после компиляции выходит:
> $ nm func.o
> 00000004 D INIT_FUNC_PRINTSTRINGT
> 00000014 D RTTI_FUNC_PRINTSTRINGT
> 00000000 D THREADVARLIST_FUNC
> 00000000 B U_FUNC_PRINTSTRING
> $ nm lib.o
>         U _GLOBAL_OFFSET_TABLE_
> 00000000 T __i686.get_pc_thunk.bx
>         U printString
> 00000000 T run
>

В общем, я разобрался в этом вопросе. Аналог заголовочного файла выглядит так:
unit func;
interface
 procedure printString(const s:string); {$IFDEF WINDOWS} stdcall;
{$ELSE} cdecl; {$ENDIF} external name 'printString';
implementation
end.

А предыдущее письмо не прошло в список рассылки из-за того, что я
вместо кода этого простого примера приложил методическое руководство
:).

-- 
С уважением, Ринат Биков.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : example.zip
Тип     : application/zip
Размер  : 2572 байтов
Описание: отсутствует
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20110608/f05c1c3d/attachment-0001.zip>


Подробная информация о списке рассылки community