Qt创建动态库

来源:互联网 发布:php unpack 字符串 编辑:程序博客网 时间:2024/05/22 13:54
备注:
1)操作系统:Ubuntu-10.10
2)Qt SDK version: 1.2.1
摘要:
本文通过两个简单的例子演示了如何使用Qt创建基于Qt应用及本地应用的动态链接库。

1. 创建基于Qt GUI应用的动态库


1.1.  创建动态库
1.1.1. 启动Qt Creator依次选择 “文件/新建文件或工程...”,在弹出的“新建”对话框中依次选择 “其他项目/C++库”,如下图所示。
Qt创建动态库 - Jim - Jim Liang
 
1.1.2. 点击“选择(C)...”出现“C++库”对话框,在对话框中输入工程名称并选择路径,如下图所示。
Qt创建动态库 - Jim - Jim Liang

1.1.3. 点击“下一步(N) >”,直到出现模块选择的对话框,如下图所示,勾选QtGui。其他按照默认设置即可,直到向导完成。
Qt创建动态库 - Jim - Jim Liang
 
1.1.4. 在创建工程向导完成后会自动生成三个文件:GuiDll_global.h,guidll.h,guidll.cpp。
1)GuiDll_global.h
此文件不用理会。
2) guidll.h
自动生成的代码如下:
#ifndef GUIDLL_H
#define GUIDLL_H

#include "GuiDll_global.h"

class GUIDLLSHARED_EXPORT GuiDll {
public:
    GuiDll();
};

#endif // GUIDLL_H

其中,关键字GUIDLLSHARED_EXPORT的意思是将类GuiDll导出。下面对该类进行更改,需求为:创建并显示一个窗口,在窗口中显示一个QLabel控件。更改后的代码如下:
#ifndef GUIDLL_H
#define GUIDLL_H

#include "GuiDll_global.h"
#include <QtCore>
#include <QtGui>

class GUIDLLSHARED_EXPORT GuiDll : public QWidget
{
public:
    GuiDll();
    QLabel m_label;
};

#endif // GUIDLL_H

3)guidll.cpp
更改后的代码如下:
#include "guidll.h"

GuiDll::GuiDll()
{
    this->resize(300,300);
    m_label.setParent(this);
     m_label.setText("Hello GUI DLL testing");
    m_label.show();
}


1.1.5. 编译构建项目(Ctrl+B)
生成如下动态库文件:libGuiDll.so,libGuiDll.so.1,libGuiDll.so.1.0,libGuiDll.so.1.0.0。其中,除libGuiDll.so.1.0.0外,其它的均为软链接。

1.2. 编写测试工程
1.2.1. 在Qt Creator中创建空白的Qt工程GuiDllTest,在工程中添加源文件main.cpp,输入如下代码:
#include <QtGui/QApplication>
#include "guidll.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    GuiDll w;
    w.show();
    return a.exec();
}

1.2.2. 由于测试工程引用了libGuiDll.so动态库,因此需要更改GuiDllTest.pro文件,添加如下内容:
LIBS += -L../GuiDll/build/ -lGuiDll
INCLUDEPATH += ../GuiDll

上面第一行表示添加库libGuiDll.so,第二行将guidll.h头文件的路径添加到工程中。
1.2.3. 在Qt Creator中点击“运行”或者按“Ctrl+R”编译并运行程序,效果如下图所示:
Qt创建动态库 - Jim - Jim Liang
 
2. 创建基于Linux C编程的动态库
上面创建的动态库只能在Qt环境下使用,为了创建能适用于Linux C开发使用的动态库需要导出C函数。

2.1. 创建动态库
2.1.1. 在Qt Creator中创建动态库工程CDll,具体步骤参考上面的。
2.1.2. 同样,Creator会自动生成三个文件:CDll_global.h,cdll.h,cdll.cpp。
2.1.3. 设计需求:改造CDll工程,导出一个标准的C API接口供普通linux程序调用,通过C API即可显示一个窗口。
2.1.4. cdll.h更改后如下所示:
#ifndef CDLL_H
#define CDLL_H

#include "CDll_global.h"
#include <QtCore>
#include <QtGui>

class Window : public QWidget
{
public:
    Window();
    QLabel m_label;
};

#endif // CDLL_H


2.1.5. cdll.cpp更改后如下所示:
#include "cdll.h"

Window::Window()
{
    this->resize(300,300);
    m_label.setParent(this);
    m_label.setText("Hello C API shows GUI testing");
    m_label.show();
}

extern "C" CDLLSHARED_EXPORT void ShowWindow()
{
    int argc=0;
    char *argv[]={NULL};

    QApplication a(argc, argv);
    Window w;
    w.show();
    a.exec();
}

说明:
1)extern "C"的作用:是将其修饰的变量或函数按照C语言的方式进行编译和连接。
2)该动态库导出了一个标准的C函数接口ShowWindow,该函数将创建一个窗口并在底层间接调用了Qt的GUI动态库。

2.1.6. 为了使代码看起来更加专业化,需要手动创建一个头文件CDllApi.h,并输入如下代码声明接口函数:
#ifndef CDLLAPI_H
#define CDLLAPI_H

void ShowWindow();

#endif // CDLLAPI_H


2.1.7. 编译构建项目(Ctrl+B)
生成如下动态库文件:libCDll.so,libCDll.so.1,libCDll.so.1.0,libCDll.so.1.0.0。其中,除libCDll.so.1.0.0外,其它的均为软链接。

2.1.8. 打包发布
将上面编译生成的动态库文件和手动创建的头文件CDllApi.h打包放在一起供第三方开发者使用。

2.2. 编写测试工程
2.2.1. 手工创建一个linux C测试工程CDllTest,文件目录结构如下图所示:
Qt创建动态库 - Jim - Jim Liang
2.2.2. 将上面刚发布的libCDll动态库及头文件CDllApi.h复制到libs文件夹。
2.2.3. 编写main.c,代码如下:
#include <stdio.h>
#include "libs/CDllApi.h"

void main()
{
    ShowWindow();
    printf("ok: application exit!\n");
}


2.2.4. 编写Makefile,代码如下:
all: CDllTest

CDllTest: main.c
    gcc main.c -o CDllTest -Llibs -lCDll

clean:
    @rm -vf CDllTest *.o *~


2.2.5. 编译工程(make),生成可执行文件CDllTest。
2.2.6. 设置动态库加载路径
由于linux系统默认的动态库加载路径为/lib和/usr/lib等几个系统重要目录,为了方便管理,此处的测试动态库只放在当前工程的libs目录下,因此必须修改环境变量LD_LIBRARY_PATH将libs目录添加到动态库的搜索路径中,命令如下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/Desktop/LJF/Qt/Work/Test/DllTest/CDllTest/libs

提示:为了调试方便,最好在系统的库目录中安装Qt库,否则需要手动从Qt SDK的安装目录中复制相应的Qt库到当前工程的libs目录进行测试。

2.2.7. 运行:./CDllTest
由于上面设置的环境变量只在当前的shell窗口中有效,因此调试程序时需要继续在该shell窗口中执行。效果如下图所示。
Qt创建动态库 - Jim - Jim Liang
0 0
原创粉丝点击