1. 程式人生 > 其它 >QT的QLibrary類的使用

QT的QLibrary類的使用

詳細說明
QLibrary類在執行時載入共享庫。

QLibrary物件的例項在單個共享物件檔案(我們稱為“庫”,但也稱為“ DLL”)上進行操作。 QLibrary以平臺無關的方式提供對庫中功能的訪問。您可以在建構函式中傳遞檔名,也可以使用setFileName()對其進行顯式設定。載入庫時,除非檔名具有絕對路徑,否則QLibrary會搜尋所有系統特定的庫位置(例如Unix上的LD_LIBRARY_PATH)。
如果檔名是絕對路徑,則嘗試首先載入該路徑。如果找不到該檔案,則QLibrary嘗試使用具有特定於平臺的檔案字首的名稱,例如Unix和Mac上的“ lib”,以及字尾,例如Unix上的“ .so”,Mac上的“ .dylib”或“。 dll”。

如果檔案路徑不是絕對路徑,則QLibrary修改搜尋順序以首先嚐試系統特定的字首和字尾,然後是指定的檔案路徑。
這樣就可以指定僅由其基名標識的共享庫(即不帶字尾),因此相同的程式碼將在不同的作業系統上工作,但仍將查詢庫的嘗試次數降至最低。
最重要的功能是:load()用於動態載入庫檔案,isLoaded()用於檢查載入是否成功,以及resolve()用於解析庫中的符號。如果尚未載入該庫,則resolve()函式隱式嘗試載入該庫。可以使用多個QLibrary例項來訪問同一物理庫。載入後,庫將保留在記憶體中,直到應用程式終止。您可以嘗試使用unload()來解除安裝庫,但是如果QLibrary的其他例項正在使用同一庫,則呼叫將失敗,並且僅當每個例項都呼叫了unload()時才進行解除安裝。
QLibrary的典型用法是解析庫中匯出的符號,並呼叫該符號表示的C函式。與“隱式連結”相反,這稱為“顯式連結”,後者是在將可執行檔案與庫連結時通過構建過程中的連結步驟完成的。
下面的程式碼片段載入一個庫,解析符號“ mysymbol”,如果一切成功,則呼叫該函式。如果出現問題,例如庫檔案不存在或未定義符號,則函式指標將為0,並且不會被呼叫。

  QLibrary myLib("mylib");
  typedef void (*MyPrototype)();
  MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol"
); if (myFunction) myFunction();

必須將符號從庫中匯出為C函式,以使resolve()起作用。這意味著,如果使用C ++編譯器編譯該庫,則該函式必須包裝在extern“ C”塊中。在Windows上,這還需要使用dllexport巨集。有關如何完成此操作的詳細資訊,請參見resolve()。為了方便起見,有一個靜態resolve()函式,如果您只想在庫中呼叫一個函式而不先顯式載入該庫,則可以使用該函式:

 typedef void (*MyPrototype)();
  MyPrototype myFunction =
          (MyPrototype) QLibrary::resolve("mylib", "mysymbol");
  if (myFunction)
      myFunction();