今天在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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源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编写线程要注意的事项