• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

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  阅读(305)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3