Qt 使用动态库与静态库
环境: windows XP, Qt4,QtCreator,MingGw
源代码下载 http://download.csdn.net/detail/cibiren2011/9119827
一. 静态库的生成
1. 测试目录: JinTaiKu
2. 源码文件名: jintaiku.h, jintaiku.cpp
3. 编写项目文件: JinTaiKu.pro
注意两点:
TEMPLATE = lib
CONFIG += staticlib
4. 生成Makefile:
qmake
5. 编译生成静态库libJinTaiKu.a
make
二. 静态库的使用
1. 测试目录: test
2. 编写main.cpp, 包含头文件JinTaiKu.h, 并调用JinTaiKu 类
3. 编写项目文件: test.pro
注意加上库路径与库文件名:
LIBS+=-L../JinTaiKu/debug -lJinTaiKu
4 编译运行test
QT中共享库的生成与使用
如果你打开一些 Windows 应用程序的目录,你会发现有很多程序的 exe 文件都很小,大约几百K 的样子,并且目录中不仅仅只有一个 exe 文件,还包含着一大堆 dll 文件。这些 dll 其实就是一些共享库,所谓共享库,其实就是一些动态链接库,能够由程序在运行时进行动态加载的库。既然说是共享,那就是说,这些库不仅仅自己的程序可以使 用,并且其他程序也可以使用,例如某些通用算法。如果你发布一下自己编写的 Qt 程序,也会看到很多系统的共享库,就是那些 QtGui.dll 之类的东西。或许你会说,我写的程序没有同其他应用共享的库,就不需要这些了吧!其实不然。因为共享库的一个好处是可以动态加载,也就是说,如果你需要升 级程序,那么就要简单的替换掉这个 dll 就好了,不需要要求用户重新安装全部文件。当然,这些 dll 也是有缺点的:动态加载的东西肯定会比静态编译的东西效率低一些。不过在现在的硬件环境下,这点性能损失已经可以忽略不计了。
今天我们要说的就是如何用 Qt 创建共享库代码。
我们还是使用 QtCreator。在创建工程的时候,我们选择下面的 C++ Library 一项,然后点击 OK。
在接下来的对话框中,有一个下拉列表,分别是 Shared Library(共享库),Statically Linked Library(静态链接库)和 Qt 4 Plugin(Qt 4 插件)。我们选择第一个共享库,后面的步骤中会要求选择加入哪几个 Qt 模块,和前面一样,选择自己需要的部分,最后完成工程的创建。
我们会看到 QtCreator 已经帮我们创建好了一些文件。其中有一个 {projectName}_global.h 的文件是 QtCreator 替我们创建的。下面我们就从这个 {projectName}_global.h 开始:
1 #ifndef LIB_GLOBAL_H 2 #define LIB_GLOBAL_H 3 4 #include < QtCore / qglobal.h > 5 6 #if defined(LIB_LIBRARY) 7 # define LIBSHARED_EXPORT Q_DECL_EXPORT 8 #else 9 # define LIBSHARED_EXPORT Q_DECL_IMPORT 10 #endif 11 12 #endif // LIB_GLOBAL_H
这个文件中只是定义了两个宏 LIBSHARED_EXPORT,注意这里的 LIB 就是我的工程名字。如果定义了 LIB_LIBRARY,LIBSHARED_EXPORT 定义为 Q_DECL_EXPORT,否则定义为 Q_DECL_IMPORT。看这个名字,就知道这就是把对象导出的语句了。下面我们来编写一个窗口(如果你希望这么做,不要忘记在创建工程时勾选 QtGui 模块,默认是不勾选的):
DongTai.h
1 #ifndef LIB_H 2 #define LIB_H 3 6 #include " DongTai_global.h.h " 7 8 class LIBSHARED_EXPORT DongTai { 9 public : 10 DongTai ( );int add(int a ,int b); 11 }; 12 13 #endif // LIB_H
DongTai.cpp
1 #include "DongTai .h " 2 3 DongTai::DongTai ( ) 5 { 6 }int DongTai::add(int a ,int b){return a+b;}
代码很简单,就是创建一个 加法运算。同前面的代码唯一不同的是,在头文件中,使用了 LIBSHARED_EXPORT 这个宏。你可以简单的把它理解成,我需要把这个类DongTai导出。所谓导出,就是将其编译成一个 dll 文件之后,其他的类可以使用这个导出类。好了,下面和原来一样,编译一下这个工程。在 debug 文件夹下你得到的是一个DongTai.dll 文件和DongTai.a。后者是 Linux 下使用的库,这里不再详述。
好了,我们要去使用这个 dll 了。新建另外一个工程,需要吧 .pro 文件修改一下:
1 TARGET = test 2 TEMPLATE = app 3 SOURCES += main.cpp4 LIBS+=-L../debug/ -lDongTai
# LIBS格式 LIBS+=-L路径 -l库名
# 生成的动态库文件 DongTai.dll
然后我们编写 main.cpp:
1 #include < QtGui / QApplication > #include "../dongtai.h" #include "stdio.h" 3 4 int main( int argc, char * argv[]) 5 { 6 QApplication a(argc, argv); 7 DongTai obj; printf("result:%d\n",obj.add(987,358)); 9 return a.exec(); 10 }
编译运行 得到运算结果。注意,单独运行test.exe时,要把 DongTai.dll拷贝到test.ext统一目录下
这个时候我们再来回忆一下,我们使用自己创建的 dll 的时候,是不是就和使用 QtGui.dll 一样呢?只不过QtGui.dll 已经放在了库目录下, 不需要手动修改 .pro 文件添加 INCLUDEPATH 和 LIBS 罢了。