。用前缀区别两种库是因为Linux的库用单一扩展(.so)。
◆ $SOSUFFIX 在库名与扩展名之间增加文本,指定版本或其它信息。
◆ $SOVERSION 在扩展名之后增加版本号。
◆ $SONAME 表示相关符号链名,由编译器自动生成。
例如,下列代码生成库libsimple.so.2.0.1和符号链libsimple.so.2。
library simple ;
uses
SysUtils,Classes;
//函数定义省略
{$SOVERSION ''2.0.1''}
{$SONAME ''libsimple.so.2''}
共享对象库的使用
Kylix应用
程序使用SO库时,可以采用两种方式:一种是隐式链接(Implicit linking),也称静态装入;另一种是显式链接(Explicit Linking),也称动态装入。下面分别介绍这两种链接方式的使用方法、技巧及将窗体对象放入SO库的技术。
1.使用前的系统设置
自定义SO库建好后,Kylix应用程序调用时会报错,这是因为Kylix找不到新建库,必须对系统进行相关设置。这与在Delphi for Windows中使用DLL库不同,DLL库建好后只需将编译后的DLL文件放到Delphi主
程序目录下即可使用。操作步骤如下:
◆ 将编译好的SO库文件放到Linux系统库目录/lib或/usr/lib下,或者在Linux系统库路径shell变量LD_LIBRARY_PATH中加入自定义SO库文件所在路径。
◆ 在根用户(root)下,用ldconfig命令刷新库缓冲区。
◆ 对Kylix执行文件使用ldd命令,查看该
程序所关联的SO库。
2.隐式链接
隐式链接是指在应用程序开始执行时就将SO库文件加载到应用程序中。实现隐式链接并不难,只需在应用程序中加入库函数的声明语句及库的external定义从句,则库函数可以和一般局部函数一样使用。比如,要使用libMyFirstSO.so中的Add函数,则只要在应用
程序中增加下面语句:
function Add (A:Integer;B:Integer):Integer;cdecl ;
external ''libMyFirstSO.so'';
3.显式链接
显式链接是应用程序在执行过程中可根据实际需要随时加载SO库文件,也可以随时卸载SO库文件,还可在运行时进行SO库的切换。而这些是隐式链接无法做到的。与隐式链接相比,显式链接具有更大的灵活性。
在Kylix中,要动态装入库和调用导出函数可以用Delphi仿真代码或自然Linux方法。下面分别介绍这两种方法。
(1)用Delphi仿真代码动态装入
在Windows中动态装入DLL是用Windows API函数—LoadLibrary或Delphi提供的SafeLoadLibrary函数完成的。找到库后,程序调用Windows API函数—GetProcAddress
搜索DLL导出函数。若找到匹配,则返回所请求函数指针,并将这个函数指针转换成适当类型和调用。使用完后调用FreeLibrary,从内存中释放库。
Kylix中使用Pascal RTL仿真函数实现SO库动态装入。下面的例子只列出Kylix应用程序中与动态链接相关部分,而非完整Kylix单元文件代码。
unit DynaForm;
interface
uses
SysUtils,Classes,Qcontrols,Qforms;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var Form1:TForm1;
implementation
{$R *.XFM}
type TComputeInteger = function (x:Integer;y:Integer):Integer;cdecl;
//调用库函数接口类型定义
procedure TForm1.Button1Click(Sender:TObject);
var Handle :Thandle ;
Compute :TcomputeInteger;
begin
Handle:=LoadLibrary(''libMyFirstSO.so'');//动态装入库
if Handle<>0 then //找到库
begin
Compute:=TcomputeInteger(GetProcAddress(Handle,''Add'');
//搜索库函数Add,并返回函数指针
&