• 博客园Logo
  • 首页
  • 新闻
  • 博问
  • 专区
  • 闪存
  • 班级
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 简洁模式 ... 退出登录
    注册 登录

ExSystem

@FreePascal
  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

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命令验证程序是否链接了该库。

posted on 2021-08-16 15:26  ExSystem  阅读(98)  评论(0)  编辑  收藏  举报

刷新评论刷新页面返回顶部
 
Powered by:
博客园
Copyright © 2023 ExSystem
Powered by .NET 7.0 on Kubernetes