diff --git a/docs/prog.tex b/docs/prog.tex index 2d4cd07880..64719779d0 100644 --- a/docs/prog.tex +++ b/docs/prog.tex @@ -42,6 +42,7 @@ % Settings % \makeindex +\FPCexampledir{progex} % % Start of document. % @@ -4211,6 +4212,82 @@ point mode have not been extensively tested as of version 0.99.5. The \var{comp} data type is currently not supported. \end{remark} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% programming libraries +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{Programming libraries} +\label{ch:libraries} +\section{Introduction} +\fpc supports the creation of shared libraries on \linux and \windows. +The mechanism is the same on both systems, although on \windows library +indexes can be used, which is not the case on \linux. + +In the following sections we discuss how to create a library, and how +to use these libraries in programs. + +\section{Creating a library} +A library can be created just as a program, only it uses the \var{library} +keyword, and it has a \var{exports} section. The following program +demonstrates a simple library: + +\FPCexample{subs} + +Compilation of this source will result in the creation of a library called +\file{libsubs.so} on \linux, or \file{subs.dll} on \windows. The compiler +will take care of any additional linking that is required to create a +shared library. + +The library exports one function: \var{SubStr}. The case is important. The +case as it appears in the \var{exports} clause is used to export the +function. + +If you want your libraru to be called from C programs, it is important to +specify the C calling convention for the exported functions with the +\var{cdecl} modifier. Since a C compiler doesn't know about the \fpc +calling conventions, your functions would be called incorrectly, resulting +in a corrupted stack. + +\section{Using a library in a pascal program} +To use this library from a pascal program, you can use the following +pascal program: +\FPCexample{psubs} +As is shown in the example, you must declare the function as \var{external}. +Here also, it is necessary to specify the correct calling convention, and +to use the correct casing for your declaration. + +This program can be compiled without any additional command-switches, +and should run just like that, provided the library is placed where +the system can find it. On \linux, this is \file{/usr/lib} or any +directory listed in the \file{/etc/ld.so.conf} file. On \windows, this +can be the program directory, the Windows system directory, or any directoy +mentioned in the \var{PATH}. + +Using the library in this way links the library to your program at compile +time. This means that +\begin{enumerate} +\item The library must be present on the system where the program is +compiled. +\item The library must be present on the system where the program is +executed. +\item Both libraries must be exactly the same. +\end{enumerate} +Or it may simply be that you don't know the name of the function to +be called, you just know the arguments it expects. + +It is therefore also possible to load the library at run-time, store +the function address in a procedural variable, and use this procedural +variable to access the function in the library. + +The following example demonstrates this technique: +\FPCexample{plsubs} + +\section{Using a pascal library from a C program} + +You can also call this library from a C program: +%\selectlisting{c} +%\FPCexample{csubs.c} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % using resources %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%