FreePascal如何使用外部库函数
- 注册动态库(Linux):
sudo vim /etc/ld.so.conf
添加一行库所在路径到文件末尾。
/path/to/lib/
保存后,执行:
sudo /sbin/ldconfig
- 主程序
test.pas
Program Test;
Uses
Foo;
Begin
WriteLn(MyFooFunc());
End.
- 库函数声明
foo.pas
Unit Foo;
Interface
Const
{$IFDEF UNIX}
// LINUX: libfoo.so
// DARWIN: libfoo.dylib
MyLib = 'foo';
{$ENDIF}
{$IFDEF WINDOWS}
MyLib = 'foo.dll';
{$ENDIF}
Function MyFooFunc(): Integer; CDecl; External MyLib Name 'my_foo_func';
Implementation
Begin
End;
- 编译命令与参数:
fpc test.pas -k-L/path/to/lib -k-lfoo
若使用Lazarus设置时,在Project/Project Options的Complier Options/Compliation and Linking的Linking/Pass options to linker with "-k", delimiter is space中,特别注意参数之间不要有多余空格(有且仅有一个空格),防止Lazarus解析参数错误,导致莫名奇妙的连接器参数问题。例如:
-L/path/to/lib -lfoo
,而非-L/path/to/lib -lfoo
!
- 也可以用预编译指令做库文件链接,并且设置编译器参数
-Fl /path/to/lib/
:
{$LINKLIB foo}
Function MyFooFunc(): Integer; CDecl; External MyLib Name 'my_foo_func';
- 可用
/sbin/ldconfig -p
查看当前系统中库的注册情况。 - 可用
ldd
命令验证程序是否链接了该库。