浏览代码

+ Improved chapter on using libraries

michael 25 年之前
父节点
当前提交
b0dfc46f1a
共有 1 个文件被更改,包括 66 次插入10 次删除
  1. 66 10
      docs/prog.tex

+ 66 - 10
docs/prog.tex

@@ -4226,12 +4226,21 @@ In the following sections we discuss how to create a library, and how
 to use these libraries in programs.
 
 \section{Creating a library}
+
+Creation of libraries is supported in any mode of the \fpc compiler,
+but it may be that the arguments or return values differ if the library is
+compiled in 2 different modes.
+
 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
+keyword, and it has an \var{exports} section. The following listing
 demonstrates a simple library:
 
 \FPCexample{subs}
 
+The function \var{SubStr} does not have to be declared in the library file 
+itself. It can also be declared in the interface section of a unit that
+is used by the library.
+
 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 
@@ -4241,19 +4250,41 @@ 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
+Creation of libraries is supported in any mode of the \fpc compiler,
+but it may be that the arguments or return values differ if the library is
+compiled in 2 different modes.  E.g. if your function expects an
+\var{Integer} argument, then the library will expect different integer
+sizes if you compile it in Delphi mode or in TP mode.
+
+If you want your library 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.
 
+On \windows, most libraries use the \var{stdcall} convention, so it may be
+better to use that one if your library is to be used on \windows systems.
+
 \section{Using a library in a pascal program}
-To use this library from a pascal program, you can use the following 
-pascal program:
+
+In order to use a function that resides in a library, it is sufficient to
+declare the function as it exists in the library as an \var{external}
+function, with correct arguments and return type. The calling convention 
+used by the function should be declared correctly as well. The compiler 
+will then link the library as specified in the \var{external} statement
+to your program\footnote{If you omit the library name in the \var{external}
+modifier, then you can still tell the compiler to link to that library using
+the \var{\{\$Linklib \}} directive.}.
+
+For example, to use the library as defined above 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.
+Here also, it is necessary to specify the correct calling convention (it
+should always match the convention as used by the function in the library), 
+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
@@ -4280,12 +4311,37 @@ variable to access the function in the library.
 
 The following example demonstrates this technique:
 \FPCexample{plsubs}
+As in the case of compile-time linking, the crucial thing in this 
+listing is the declaration of the \var{TSubStrFunc} type. 
+It should match the declaration of the function you're trying to use.
+Failure to specify a correct definition will result in a faulty stack or,
+worse still, may cause your program to crash with an access violation.
 
 \section{Using a pascal library from a C program}
 
-You can also call this library from a C program:
-%\selectlisting{c}
-%\FPCexample{csubs.c}
+\begin{remark}
+The examples in this section assume a \linux system; similar commands
+as the ones below exist for \windows, though.
+\end{remark}
+
+You can also call a \fpc generated library from a C program:
+\Cexample{ctest}
+To compile this example, the following command can be used:
+\begin{verbatim}
+gcc -o ctest ctest.c -lsubs
+\end{verbatim}
+provided the code is in \file{ctest.c}. 
+
+The library can also be loaded dynamically from C, as shown in the following
+example: 
+\Cexample{ctest2}
+This can be compiled using the following command:
+\begin{verbatim}
+gcc -o ctest2 ctest2.c -ldl
+\end{verbatim}
+\lstset{language=delphi}
+The \var{-ldl} tells gcc that the program needs the \file{libdl.so} library 
+to load dynamical libraries.
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%