QT動態庫和靜態庫使用


  軟件版本:QT5.12.0 + Qt Creator4.8.0

  動態鏈接

  動態鏈接庫又叫"共享庫",即sharedLib

  Qt Creator中新建項目,選擇"Library"->"C++ 庫"

選擇"共享庫",選擇位置,輸入名稱:QtSharedLib

選擇MinGW構建,一直默認到完成即可!

最終生成如下文件:

完善導出類和導出函數:

編譯鏈接最終生成文件:

  其中.a是導入庫,相當於Windows下的lib文件,.dll是共享庫文件,相當於Windows下的dll文件,.o是目標文件,相當於Windows下的obj文件。

 

  共享庫的調用:

  1)、使用QLibrary顯式鏈接,需要將dllexe放在一起

  新建Qt Console應用程序,代碼如下:

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
#include <QCoreApplication>
#include <QLibrary>
#include <QDebug>
#include  "QtStaticLib.h"

int  main( int  argc,  char  *argv[])
{
    QCoreApplication a(argc, argv);

    
// 聲明函數指針
    typedef  int  (*Add)( int  a,  int  b);
    typedef 
int  (*Sub)( int  a,  int  b);
    typedef 
int  (*Mul)( int  a,  int  b);
    typedef 
int  (*Div)( int  a,  int  b);

    
// 顯式鏈接
    QLibrary mylib( "QtSharedLib.dll" );
    
if (!mylib.load())
    {
        
// 加載 dll 失敗
        qDebug() <<  "Load QtSharedLib.dll failed!" ;
        
return  - 1 ;
    }

    
// 需要知道有哪些導出函數,可通過depends.exe查看
    Add add = (Add)mylib.resolve( "add" );
    Sub sub = (Sub)mylib.resolve(
"subtraction" );
    Mul mul = (Mul)mylib.resolve(
"multiplication" );
    Div div = (Div)mylib.resolve(
"division" );
    
if (nullptr == add)
    {
        qDebug() << 
"Load function add failed!" ;
        
return  - 1 ;
    }
    
if (nullptr == sub)
    {
        qDebug() << 
"Load function sub failed!" ;
        
return  - 1 ;
    }
    
if (nullptr == mul)
    {
        qDebug() << 
"Load function mul failed!" ;
        
return  - 1 ;
    }
    
if (nullptr == div)
    {
        qDebug() << 
"Load function div failed!" ;
        
return  - 1 ;
    }

    
// 調用函數
    qDebug() << add( 1 2 );
    qDebug() << sub(
6 2 );
    qDebug() << mul(
3 2 );
    qDebug() << div(
8 2 );

    
return  a.exec();
}

  2)、使用隱式鏈接

  新建Qt Widget應用程序:

  將QtSharedLib工程源碼目錄下的 QtSharedLib.hQtSharedLib_global.hQtSharedLib.a復制到該工程源碼目錄下,將 QtSharedLib.dll 文件復制到生成exe所在目錄中。

  添加.a文件時,可在工程上右鍵,在彈出的菜單中選擇"添加庫"

  

  最后自動在pro文件中加入庫鏈接:

  

  主函數調用:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 # include  "Widget.h"
 # include < QApplication >
 # include 
"QtSharedLib.h"

int  main( int  argc,  char  * argv[])
{
    QApplication a(argc, argv);

    
// Widget w;
     // w.show();

    QtSharedLib sharedLib;
    sharedLib.showMessage();

    
return  a.exec();
}

  輸出showMessage實現的打印信息:

  

 

  靜態鏈接

  Qt Creator中新建項目,選擇"Library"->"C++ 庫"

選擇"靜態鏈接庫",選擇位置,輸入名稱:QtStaticLib

選擇MinGW構建,一直默認到完成即可!

  完善靜態庫代碼

  

  編譯生成靜態庫文件:只有.a和.o文件

  

  靜態庫的調用

  這里使用隱式鏈接的方法:

  繼續使用前面的Console應用程序,將靜態庫的.a文件以及.h文件拷貝到工程源碼目錄下,是"添加庫…"操作將庫配置寫入pro文件

  輸出showMessage實現的打印信息:

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM