• 13889阅读
  • 8回复

在Windows XP下编写Qt dll并调用 [复制链接]

上一主题 下一主题
离线aesoplord
 

只看楼主 倒序阅读 楼主  发表于: 2009-06-01
各位大虾,
最近初学Qt,想在Windows XP下用Qt编写一个dll,并用一个exe调用这个dll的导出函数。看了Qt帮助里面介绍的是使用QLibrary动态加载
dll。而我比较想的方式是使用它的.lib文件,然后在exe中include相应的导出函数的头文件。说白了,我期望的方式就是想使用Qt本身的库一样,
比如我想使用QString类,就用预处理命令:#include <QString>就可以了,然后下面就可以使用QString类了。

我的做法如下:
1.用Qt新建向导生成一个dll工程:mylib
向导生成了如下文件:mylib.pro,mylib.cpp,mylib.h,mylib_global.h
2.然后在mylib.cpp,mylib.h写了我自己需要的导出函数:Mylib
具体的几个内容文件如下:

========================================================
(1) mylib.pro

#-------------------------------------------------
#
# Project created by QtCreator 2009-06-01T21:05:56
#
#-------------------------------------------------

QT -= gui

TARGET = mylib
TEMPLATE = lib

DEFINES += MYLIB_LIBRARY

SOURCES += mylib.cpp

HEADERS += mylib.h\


========================================================
(2) mylib.cpp


#include "mylib.h"
#include <iostream>
using namespace std;

extern "C" void MYLIBSHARED_EXPORT Mylib()
{
cout<<"Yes!"<<endl;
}

=======================================================
(3) mylib.h

#ifndef MYLIB_H
#define MYLIB_H

#include "mylib_global.h"

extern "C" void MYLIBSHARED_EXPORT Mylib();

#endif // MYLIB_H
=======================================================
(4) mylib_global.h

#ifndef MYLIB_GLOBAL_H
#define MYLIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYLIB_LIBRARY)
# define MYLIBSHARED_EXPORT Q_DECL_EXPORT
#else
# define MYLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYLIB_GLOBAL_H


编译后一切正常,也生成了dll。然后我又用向导生成了一个控制台界面的exe工程:test,并把dll和.a文件都拷贝到了工程的debug目录下
准备调用dll里的导出函数Mylib,内容如下:
============================================================
test.pro
#-------------------------------------------------
#
# Project created by QtCreator 2009-06-01T21:19:51
#
#-------------------------------------------------

QT -= gui

TARGET = test
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app


SOURCES += main.cpp
HEADERS += mylib.h

LIBS += D:\Qt\project\mylib\test\debug

============================================================
main.cpp

#include <QtCore/QCoreApplication>
extern "C"
{
#include "mylib.h"
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Mylib(); //调用dll导出函数
return a.exec();
}

编译运行出现如下错误:
collect2 : ld returned 1 exit status.
不知道是什么原因,还请指教

另外我google的时候看见有人说用.so文件,可是编译器压根就没产生那个文件啦,只有.dll,.o,.a文件,请问.so是不是在Linux下才能生成啊,
反正使用起来有点糊涂,望达人多指教,希望详细点,谢谢
离线cspp

只看该作者 1楼 发表于: 2009-06-02
1、mylib.pro写的不对
增加CONFIG    += staticlib。
2、另外,mylib.h和mylib.cpp中直接写extern "C" void MyLib()就可以了。
3、test.pro中增加LIBS += -lmylib
PS:LIBS += D:\Qt\project\mylib\test\debug 是啥意思?
再试试看?
离线浪漫天使
只看该作者 2楼 发表于: 2009-06-02
用depend工具看看 生成的dll里面 到底导出了函数没有
如果没有 在你的 mylib.pro 里面加入
CONFIG += dll
再试试
离线zuoyi

只看该作者 3楼 发表于: 2010-02-02
关注!请高手继续讲解!请斑竹关注这个问题!
学习Qt技术...
离线benbenmajia

只看该作者 4楼 发表于: 2010-02-02
.so文件时在linux环境下生成的动态库,dll时windows下生成的
安然.....
离线jerychang
只看该作者 5楼 发表于: 2010-04-23
ding ding
QT HAO..
离线tnt_vampire
只看该作者 6楼 发表于: 2010-06-08
基本如cspp所说的,再把你的库路径改成这样:
-L"D:\Qt\project\mylib\test\debug"
离线limj1987

只看该作者 7楼 发表于: 2011-10-16
在test.pro文件加LIBS += "mylib.dll"即可
离线jdwx

只看该作者 8楼 发表于: 2011-10-16
在test.pro文件加LIBS += "mylib.lib"即可//用vc编译器得这么写。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
快速回复
限100 字节
 
上一个 下一个