1. 程式人生 > 其它 >DRT的安裝和配置方法

DRT的安裝和配置方法

DRT的安裝和配置方法

  • 下載地址:YWtheGod/DRT (gitee.com) 可以直接用git clone也在頁面上點[克隆/下載]的橙色按鈕選擇下載zip包。Git的用法就不在這裡展開了,不會的建議都去學一下。
  • 下載,解壓其中的BIN.7Z壓縮包,裡面有編譯好的C庫檔案分別是:
    • DRT.x64.avx2.dll:主流CPU使用的WIN64位DLL庫,存放在系統搜尋路徑或與你的目標應用程式擺放在一起;
    • DRT.x64.sse2.dll:老CPU或低端無AVX指令集的WIN64位DLL庫,存放在系統搜尋路徑或與你的目標應用程式擺放在一起;
    • DRT.Win32.avx2.dll:主流CPU使用的32位DLL庫。
    • DRT.Win32.sse2.dll:不支援AVX CPU用的32位DLL庫
    • Libdrt.linux64.a:Linux64平臺用的靜態連結庫,存放在Linux64平臺的Library搜尋路徑上,該路徑的設定位置如圖:
    • Drt.arm.a: Android32平臺用的靜態連結庫,存放在Android32平臺的Library搜尋路徑上,設定位置同上圖,在Selected Platform下拉框中切換到Android32平臺;
    • Drt.arm64.a: Android64位平臺用的靜態連結庫,同理存放在Android64平臺的Library搜尋路徑上
      【我個人建議將你解壓出來的BIN資料夾同時加入到Linux64,Android32,Android64的Library路徑中。】
  • 壓縮包裡還有三個drt_override開頭的.o檔案,這些檔案需要在每個單獨專案中將其絕對路徑新增到專案引數中,所以存放在哪不重要,保留在BIN資料夾即可。
  • 升級Delphi的Linux64平臺連結器,DRT庫的庫檔案都是用較新版本的Clang編譯器編譯的(準確地說:Win下用的是Clang13.01,Linux64下用的是Clang15.01,Android下用的是Clang14.01),而Delphi自帶的Linux64連結器是LLVM5版本的,無法識別新版本的目標檔案,解決辦法就是從Android SDK複製新版本的LLVM連結器到Delphi的Bin目錄下,替換原版的ld-linux.exe檔案(記得備份原檔案):
  • 開啟下載好的DRT目錄下的DRTGRP. Groupproj專案組檔案,DRT庫主要由三個dpk庫組成:DRT,DRTWIN,DRTVCL。DRT庫存放跨平臺程式碼,包含的所有單元都可以在所有平臺編譯,DRTWIN庫包含WINDOWS平臺單元,但是可以跨VCL和FMX使用,DRTVCL庫包含VCL框架單元,需要執行在VCL環境下,你可以一次性編譯所有庫檔案所有平臺的Release和Debug版本,按下圖次序點選按鈕即可開始批量編譯,注意編譯前修改好你自己本地的單元輸出路徑:
  • 前文提到的三個drt_override*.o,其作用是在非Windows平臺下替換系統自帶的一些函式,之所以用.o檔案形式提供,是為了可以在連結時優先佔據函式名稱表,以實現函式替換,使用方法如下:
    在新建的非Windows平臺專案中,開啟專案屬性對話方塊,在Linking->Options passed to LD Linker屬性欄裡填寫上對應平臺的drt_override*.o檔案的絕對路徑檔名:
    Linux64平臺:

    Android32平臺:

    Android64平臺同理;
    不新增這個.o檔案路徑,原始碼可以無需改動正常編譯,只是不會啟用mimalloc記憶體管理器和其他的一些優化程式碼。
  • DRT庫預設設定是啟用AVX2指令集,如果想切換成支援老CPU的SSE2模式,在下圖的位置去掉AVX2的預設定義即可:

    重新編譯DRT庫將會將DLL引用指向SSE2版本的DLL,Linux64平臺下靜態庫為AVX2版本,並未提供SSE2選擇,目前看來伺服器應用沒有這個必要。
  • 將Drt.Init單元,加入你的專案的單元列表的首位位置,這將執行一切必須的初始化程式碼,啟用可用的優化。
  • DRT包在Linux64平臺下,將會編譯成一個SO動態庫檔案,一般我們預計大家會靜態連結編譯好的DCU檔案,這個DPK專案只不過是作為一個編譯批處理的效果,然而如果你的確想用SO形態使用這個DRT庫的話,請記得將drt_override.linux64.o的絕對路徑新增到DRT.SO的連結引數選項中。
  • 大致想起寫下這些,如果還有疑問,請加Q群490269542找我詢問(本人部落格和Q號均為實名)