• 7100阅读
  • 3回复

求教用qt编写window下动态库的一个问题 [复制链接]

上一主题 下一主题
离线sunnywolf
 

只看楼主 倒序阅读 楼主  发表于: 2006-04-11
我用qt写了一个非常简单的动态库,但是出错了,在这里求教各位大大了。
我是在windows下写的,头文件代码如下:
#ifndef __GLGRAPH_H
#define __GLGRAPH_H

//#ifndef QT_H
//#include "qglobal.h"
//#endif // QT_H

#include "MacroDef.h"

struct tagglGraph;

#define GLGRAPH_API __declspec(dllexport)

class GLGRAPH_API glGraph
{
public:
  glGraph();
  ~glGraph();
  virtual bool create( );
  GL_TYPE getType();
  bool   isSel() const;
  void   setSel( bool bSel );
  virtual void glDraw() {};
private:
  tagglGraph *m_baseGraph;
};
#endif
ps:类定义本来加了Q_EXPORT修饰,不过在官方的qt-interest上看见别人给的建议说最好自定义宏,就自定义了一个,但是2者最后产生的结果一样。GL_TYPE是自定义的一个枚举类型。
然后就是一个cpp文件来实现类的细节。
pro文件如下:
TEMPLATE = lib
TARGET = glGraph
DESTDIR = ..\lib
DLLDESTDIR = ..\dll
CONFIG += dll
DEPENDPATH += F:\GLtest\glGraph\include F:\GLtest\glGraph\source
INCLUDEPATH += F:\GLtest\glGraph\include.
# Input
HEADERS += include\GLGraph.h \
      include\MacroDef.h \
      source\glGraphStruct.h \
      source\graphID.h
SOURCES += source\glGraph.cpp

在windows下使用命令行编译,用qmake生成makefile,然后用nmake编译,能够通过,而且也生成了dll和lib文件
但是在其他程序调用时会出现连接错误,如下:
test.obj : error LNK2001: unresolved external symbol "public: virtual bool __thi
scall glGraph::create(void)" (?create@glGraph@@UAE_NXZ)
test.obj : error LNK2001: unresolved external symbol "public: __thiscall glGraph
::~glGraph(void)" (??1glGraph@@QAE@XZ)
test.obj : error LNK2001: unresolved external symbol "public: bool __thiscall gl
Graph::isSel(void)" (?isSel@glGraph@@QAE_NXZ)
test.obj : error LNK2001: unresolved external symbol "public: __thiscall glGraph
::glGraph(void)" (??0glGraph@@QAE@XZ)
实在找不到什么原因了,各位大大帮帮忙, 江湖救急啊。
谢谢了
[ 此贴被XChinux在2006-04-11 16:04重新编辑 ]
离线chongzai

只看该作者 1楼 发表于: 2006-04-14
struct tagglGraph;

#define GLGRAPH_API __declspec(dllexport)

class GLGRAPH_API glGraph


上面定义不对!

应该这样:
#ifdef _MYDLL
#define GLGRAPH_API __declspec(dllexport)
#else
#define GLGRAPH_API __declspec(dllimport)
#endif

然后在这个动态库的工程设置里面加入宏定义 _MYDLL
离线cocalele
只看该作者 2楼 发表于: 2006-04-14
在生成DLL的代码里要用__declspec(dllexport),在使用DLL的代码里要使用__declspec(dllimport)。一个导出一个导入
离线XChinux

只看该作者 3楼 发表于: 2006-04-14
如果你只是自己工程里使用,不供其它语言和库使用,那么就和写目标文件一样写就行了。不用加导入导出。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个