各位大虾,
最近初学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下才能生成啊,
反正使用起来有点糊涂,望达人多指教,希望详细点,谢谢!