以前一直用GCC/mingw来写Qt程序,近来想要将自己写的程序框架能够使用MSVC2005来编译,结果遇到不小的麻烦,搞了一晚上,终于基本移植成功。下面写一下需要注意的问题:
1、由于mingw与msvc2005编译后的动态库格式不一样,所以在使用Qt编写DLL的时候,要注意
加导出库声明,假设某个DLL为mda.dll则,在要提供导出接口头文件mda.h中按如下定义:
#ifndef MDA_DLL_H
#define MDA_DLL_H
#include // 必须先包含此头文件,否则Q_WS_WIN未定义
#ifdef Q_WS_WIN
#ifdef BUILDING_MDA_DLL // 一定记得在编译此DLL的.pro文件中定义此宏
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif // BUILDING_MDA_DLL
#else
#define DLLAPI
#endif // Q_WS_WIN
#include
namespace MDA { // 可以将所有的函数包含在某一个名字空间中,也可以不要此行
DLLAPI extern QMap _sessions; // 导出全局变量
DLLAPI QString getOpenFile(QString dir, QString filter) ; // 导出全局函数
class DLLAPI MDAClass { // 导出类
................
}; // MDAClass
} // MDA namespace
#endif // MDA_DLL_H |
|
对于mda.cpp的实现,则和一般的实现一样,不必做特殊处理:
#include "mda.h"
#include // 包含其它需要的头文件
namespace MDA {
QMap _sessions;
QString getOpenFile(QString dir, QString filter)
{
...................
}
MDAClass::MDAClass()
{
...
}
MDAClass::~MDAClass()
{
...
}
} |
|
在编译此DLL的.pro文件中,则大致如下:
TEMPLATE = lib
DEFINES += BUILDING_MDA_DLL
...........
HEADERS += mda.h
SOURCES += mda.cpp |
|
在编译时,如果用的是gcc(Linux)则会生成libmda.so文件,如果是mingw,则会生成mda.dll和libmda.a文件,如果是msvc2005,则会生成mda.dll和mda.lib文件
而我们在其它的程序(无论是可执行程序还是动态库)中要想使用上面生成的这个动态库的话,只要在需要的地方将mda.h加入进去即可,并且在.pro文件中加上-lmda,比如:
在源文件中加入头文件
在工程文件中加入头文件包含目录,库文件包含目录及库名
......
INCLUDEPATH += ../mda
LIBS += -L../mda -lmda
...... |
|
如上即可。
阅读(1871) | 评论(0) | 转发(1) |