加載動態庫(共享庫)的兩種方式——Qt

前言

 

在程序編碼時,經常會用到動態庫(DLL),比如分享自己的寫的功能代碼或者使用第三方的插件時。之前我只會最常用的加載方式(靜態加載),後來在項目中要求動態加載,才學會了動態加載的方式。但是爲什麼要用不同的加載動態庫方式呢?接下來,我們一起來探索它的答案。

 

兩種方式介紹

1.傳統常用的方式(靜態加載)

靜態調用前提是在編譯之前已經明確知道調用DLL中的哪些函數,需要lib和相應的導入頭文件*.h。編譯時,在目標文件中只保留必要的鏈接信息,而不含DLL函數的代碼;當程序執行時,利用鏈接信息加載DLL函數代碼並在內存中將其連接入調用程序的執行空間中,其主要目的是便於代碼共享。

平時,在龐大的項目中,我們需要配合工作將一些公用的功能封成dll,爲了便於大家的使用。一般功能比較複雜的dll,通常使用靜態加載的方式,一般情況下,dll的頭文件都會寫清楚暴露的函數說明,這樣便於對功能的理解和代碼的共享。

至於Qt Creator和VS靜態加載動態庫(dll)的配置,我這裏就不贅述了,網上有很多,下面我提供了網友的教程的鏈接,便於懶癌患者的使用。

Qt Creator和VS的配置:https://blog.csdn.net/u013554213/article/details/79644916

 

2.動態加載(QLibrary)

動態調用主要通過API函數(Window LoadLibrary、GetProcAddress、FressLibrary)來調用程序運行後需要的DLL函數,節省內存空間。QT中,則主要通過QLibrary進行動態加載(適用於跨平臺)。

一般dll功能相較簡單、比較好理解、較小時,通常使用動態加載的方式,這種方式只需要將dll放到運行目錄下,或者固定路徑下,其他就不需配置了。下面我介紹一下兩種方式

Qt方式加載:

用Qt的方式,主要用到類QLibrary,它在運行時加載共享庫,具體代碼如下

    QLibrary myLib("mylib");
    //構造函數加載路徑下的dll或者使用setFileName函數來加載路徑下的dll
    // myLib.setFileName("mylib");
    
    //判斷是否加載成功
    if(myLib.load())
    {
        //創建函數指針與需加載的函數對應 typedef 返回值 (*函數指針名)(入參)
        typedef void (*MyPrototype)();
        MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
        if (myFunction)
            myFunction();
        
        //如果後續不再需要使用dll,則需要釋放
        myLib.unload();
    }

純C++(windows)方式加載:

    typedef void (*MyPrototype)();
    HINSTANCE hDLL;//DLL句柄
    MyPrototype myFunction;//函數指針
    hDLL = LoadLibrary(TEXT("mylib"));
    if(hDLL)
    {
        myFunction = (MyPrototype)GetProcAddress(hDLL, TEXT("mysymbol"));
        if (myFunction)
            myFunction();
        FreeLibrary(hDLL);
    }

 

結束語

差不多就到這裏吧,最常用的dll,拜拜了~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章