秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  277 随笔 :: 0 文章 :: 308 评论 :: 19万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

今天在qq群从LOK大佬那学到的。

linux调用动态库文件,如果你把so放程序目录下的话,要加一下rpath

复制代码
procedure LoadLibraryFunctions;
begin
  {$ifdef Windows}
    PKAccessDllHandle := LoadLibrary('pkTcpCommand.dll');
  {$else}
    PKAccessDllHandle := LoadLibrary('libpkTcpCommand.so');
  {$endif}

  if PKAccessDllHandle = 0 then
  begin
    ShowMessage('无法加载动态库');
    Exit;
  end;
end;
复制代码

这里加了两个路径,一个是程序目录,一个是程序目录下的dll,你根据自己需要改就可以了:
rpath里用'$ORIGIN'通配符就表示程序当前目录了

-k"-rpath='$ORIGIN':'$ORIGIN'/dll

mac下的连接器有点区别,rpath要按下面这样写。
-k"-rpath @loader_path"跟-k"-rpath ./" 有什么区别呢?一个指程序所在路径,一个指运行程序时的路径,比如你可以这样运行程序的/apppath/abcd/app,这个时候两个值就不一样了,特别用脚本启动程序的时候都不会先cd /apppath/abcd/

-k"-rpath @loader_path"
-k"-rpath @loader_path/dll"
-k"-rpath ./"
-k"-rpath ./dll"


也可以在程序运行前设置环境参数:

复制代码
procedure SetEnvPath(AddPath: AnsiString);
var
  OldPath: AnsiString;
const
  {$IFDEF MSWINDOWS}
  cPathKey: AnsiString = 'Path';
  {$ELSE}
  cPathKey: AnsiString = 'PATH';
  {$ENDIF}
begin
  if AddPath = '' then
    Exit;

  if AddPath[Length(AddPath)] = SysUtils.PathDelim then
    Delete(AddPath, Length(AddPath), 1);

  OldPath := GetEnvValue(cPathKey);
  if Q_PosEx(AddPath, OldPath) > 0 then
    Exit;

  if (OldPath <> '') and (AddPath[Length(AddPath)] <> SysUtils.PathSep) then
    AddPath := AddPath + SysUtils.PathSep;

  SetEnvValue(cPathKey, AddPath + OldPath);
end;
复制代码

 

posted on   秋·风  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2024-02-07 修正lazarus 3.0/fpc3.3.1交叉编译unidac应用(aarch64 linux)时UniProvider.pas编译出错(2024-11-07更新)
2024-02-07 lazarus 3.0/fpc3.3.1编写线程要注意的事项
点击右上角即可分享
微信分享提示