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++库”,如下图所示。
1.1.2. 点击“选择(C)...”出现“C++库”对话框,在对话框中输入工程名称并选择路径,如下图所示。
1.1.3. 点击“下一步(N) >”,直到出现模块选择的对话框,如下图所示,勾选QtGui。其他按照默认设置即可,直到向导完成。
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”编译并运行程序,效果如下图所示:
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,文件目录结构如下图所示:
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窗口中执行。效果如下图所示。
1)操作系统:Ubuntu-10.10
2)Qt SDK version: 1.2.1
摘要:
本文通过两个简单的例子演示了如何使用Qt创建基于Qt应用及本地应用的动态链接库。
1. 创建基于Qt GUI应用的动态库
1.1. 创建动态库
1.1.1. 启动Qt Creator依次选择 “文件/新建文件或工程...”,在弹出的“新建”对话框中依次选择 “其他项目/C++库”,如下图所示。
1.1.2. 点击“选择(C)...”出现“C++库”对话框,在对话框中输入工程名称并选择路径,如下图所示。
1.1.3. 点击“下一步(N) >”,直到出现模块选择的对话框,如下图所示,勾选QtGui。其他按照默认设置即可,直到向导完成。
此文件不用理会。
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”编译并运行程序,效果如下图所示:
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,文件目录结构如下图所示:
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窗口中执行。效果如下图所示。
0 0
- Qt创建动态库
- Qt创建动态库
- Qt创建动态链接库
- qt创建动态库,静态库
- Qt创建和使用动态链接库
- Qt创建和使用动态链接库
- Qt创建和使用动态链接库
- QT创建和使用动态链接库
- Qt 创建和使用动态链接库
- Qt 创建和使用动态链接库
- QT创建c/c++动态库
- Qt创建和使用动态链接库
- QT 动态创建对象
- Qt 创建与使用动态库与静态库
- Qt中静态库与动态库的创建方法
- 基于Qt的动态库*.dll文件创建
- 使用Qt创建动态和静态链接库
- QT:动态链接库的创建与使用
- Java桌面程序打包成exe可执行文件
- [转载]自动控制的故事
- Hot Days Codeforces Round #132 (Div. 2) D(贪心)
- android蓝牙控制继电器——手机客户端的实现
- 题目1388:跳台阶
- Qt创建动态库
- bochs安装一系列问题
- Android 中遇到的一些警告 错误
- 为QT应用程序添加图标
- Android Layout 之 RelativeLayout之addRule()方法
- 程序猿之---C语言细节9(宏定义、max(a,b)宏定义细节、大小端判断、(int&)a什么意思)
- 兼容性
- 二叉树学习之堆排序
- 考生须知