Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1684235
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: WINDOWS

2011-04-07 10:04:50

以前一直用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,比如:

在源文件中加入头文件

#include

在工程文件中加入头文件包含目录,库文件包含目录及库名

......
INCLUDEPATH += ../mda
LIBS += -L../mda -lmda
......


如上即可。
阅读(1871) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~