今天在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;

浙公网安备 33010602011771号