秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

今天在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 2025-02-07 14:09  秋·风  阅读(261)  评论(0)    收藏  举报