1. 如何用qt在linux中编写并使用动态链接库
先写好实现动态链接库的libmy.cpp文件和libmy.h文件,如下:
// libmy.cpp
#include"libmy.h"
#include<iostream>
using namespace std;
MyLib::MyLib()
{
}
MyLib::~MyLib()
{
}
void MyLib::hello()
{
cout << "hello world~!" << endl;
}
// libmy.h文件
#ifndef LIBMY_H
#define LIBMY_H
class MyLib
{
public:
MyLib();
~MyLib();
void hello();
};
#endif /*LIBMY_H*/
然后写好pro文件,如下:
TEMPLATE = lib
TARGET =DllTest
HEADERS += libmy.h
SOURCES += libmy.cpp
保存关闭,文件名命名为MyDll.pro
在Shell里执行qmake MyDll.pro,在没有错误的情况下,然后执行make ,可以看到生成了几个后缀名为so的文件,如下图:
2. 怎样解决Qt编译出的程序运行时缺少libgcc
缺少动态链接库,你的qt是动态编译的,根据提示上你qt的安装目录上考到你的exe文件夹里
3. Qt下如何编译库
一般分为动态库和静态库,方法分别如下:
一.
静态库的生成
1.
测试目录:
lib
2.
源码文件名:
mywindow.h,
mywindow.cpp
3.
编写项目文件:
mywindow.pro
注意两点:
TEMPLATE
=
lib
CONFIG
+=
staticlib
4.
生成Makefile:
qmake
mywindow.pro
5.
编译生成静态库libmywindow.a
make
二.
静态库的使用
1.
测试目录:
test
2.
将mywindow.h与libmywindow.a拷贝至test目录下
3.
编写main.cpp,
包含头文件mywindow.h,
并调用MyWindow类
4.
编写项目文件:
test.pro
注意加上库路径与库文件名:
LIBS
+=
-L
./
-lmywindow
5.
生成Makefile:
qmake
test.pro
6.
编译:
make
7.
运行:
./test
三.
动态库的生成
动态库编译基本和静态库类似,需要将上述将要进行编译的项目文件.pro中下面这行去掉
CONFIG
+=
staticlib
按上述操作编译完后就可以得到以lib开头并且.so*
结尾动态库文件,一般有多个。
4. QT程序调用MFC的动态链接库DLL
这个很难了,因为MFC有自己的初始化,这个一般是在程序启动的时候完成的;而qt有自己的初始化,如果你强行加入MFC的初始化,应该也可以,但是麻烦而且丑陋.
建议你把Analyse模块的逻辑抽出来,生出独立的,不依赖于界面(无论是MFC还是QT)的纯C++代码,然后以QT为界面实现原来的逻辑,最后再跟GASOOH结合起来.
5. makefile中怎么链接QT的动态库详细请看下面
写法正确,只是你的LD_LIBRARY_PATH设置不对,找不到连接库的路径
export $LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/local/lib
类似这样写
6. qt动态链接库建立需要包含哪些模块
先新建一个库项目
选择chose进入下一下页面,类型选择共享库,输入一个名称:我输入的是sld
再点击下一步到
如果这里我们需要QtGui所以也勾选上了
再点击下一步直到完成
我们在.pro文件里加上
DESTDIR =..\MyDebug
它的意思是我们把生成的内容放到这个文件夹里,如果没有它会自动生成
点击项目把Shadow build 去掉勾选
设置完成后我们来实现方法测试
把sld.h修改成这样
#ifndef SLD_H
#define SLD_H
#include "sld_global.h"
#include <QString>
class SLDSHARED_EXPORT Sld
{
public :
Sld();
QString GetStr();
};
#endif
它的.cpp
#include "sld.h"
#include <QDebug>
Sld::Sld()
{
qDebug()<<"";
}
QString Sld::GetStr()
{
return "aa";
}
我们那了一个测试方法返回aa
我们再新添加一个窗体供测试用
我给命名为MyDialog
把.h文件修改成
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include <QDialog>
#include "sld_global.h"
namespace Ui {
class MyDialog;
}
class SLDSHARED_EXPORT MyDialog : public QDialog
{
Q_OBJECT
public:
explicit MyDialog(QWidget *parent = 0);
~MyDialog();
private:
Ui::MyDialog *ui;
};
#endif // MYDIALOG_H
,cpp
#include "mydialog.h"
#include "ui_mydialog.h"
MyDialog::MyDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MyDialog)
{
ui->setupUi(this);
}
MyDialog::~MyDialog()
{
delete ui;
}
这里什么也没做只是把SLDSHARED_EXPORT加上了
好了就这样,我们构建一下就会在MyDebug文件夹里生成我们的dll
7. 怎样在Qt中建立使用动态链接库
工具/原料
安装有Qt集成开发环境的Windows或Linux
一、建立并生成动态链接库
1
首先在磁盘的某个位置建立一个名为DllDemo的文件夹。
打开QtCreator,新建工程,选择Library,C++库,然后就是choose。
2
然后在弹出的C++库对话框默认类型共享库,名称为MyDll。路径就是刚才建立的DllDemo文件夹。然后,一直下一步,直到点击完成。
3
来看看程序结构,以及pro文件内容。
可以看到系统自动生成了一个mydll_global.h的文件。
pro内也自动生成了一些内容。可以看到TEMPLATE = lib,而不是平时的TEMPLATE = app。
4
再来看看mydll_global.h的内容。
可以看到系统自动定义了两个宏。用于声明哪些函数是需要导出的。
5
下面来给代码添加点内容,以便于待会使用。
首先我们在mydll.h中添加几行代码,
注意:extern "C" MYDLLSHARED_EXPORT必须要有。
6
再来看看mydll.cpp中的实现代码,都比较简单。
7
代码编写完毕后,直接构建就行了。然后就可以看到生成的dll了。
二、测试生成的DLL
1
新建一个基于Qt的控制台应用程序,名称为DllTest。依然放置在DllDemo的目录下。
2
建好了以后,就可以在main.cpp写代码了。通过QLibrary类来加载dll。
因为要获得类对象的实例,所以需要将mydll.h包含进来。
要注意的是,我没有对函数是否成功获取做检测。
来看看代码:
3
代码写完后就可以构建程序了。不过要运行程序,还需要将刚才生成的dll拷贝到程序的同级目录。
4
在IDE中运行程序,因为生成的是debug版的程序,相关的环境变量未设置,无法独立运行。
可以看到dll工作的很好,程序运行正常。
三、善用Assistant
1
最后来看看Assistant中关于QLibrary的描述。比较费解的是,Assistant中并没有对创建共享库做详细的说明,估计是这个太简单或资料太多了吧。
8. 如何用Qt调用matlab生成的动态库
动态库的生成
1>首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared,
gcc -fpic -c add.c
gcc -fpic -c sub.c
生成中间文件add.o和sub.o
2>其次生成动态库
gcc -shared –o libtiger.so add.o sub.o
生成动态库libtiger.so,libtiger.so就是我们生成的目标动态库。我们以后使用动态库和main.c程序生成可执行程序
说明:
以上两部也可以合成一步搞定:
gcc -fpic -shared add.c sub.c -o libtiger.so
2.使用动态链接库
在编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式,在生成可执行文件的时候会链接库文件。
1>使用命令:
gcc -o main main.c -L ./ -ltiger
2>-L指定动态链接库的路劲,-ldtiger链接库函数tiger。-ltiger是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。
3>但是程序会提示如下错误
error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct
这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。
4>使用以下方法可以解决此问题
a. 在linux下最方便的解决方案是拷贝libtiger.so到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo哦,亲)。就可以生成可执行程序了
b.第二种方法是:将动态链接库的目录放到程序搜索路径中,可以将库的路径加到环境变量LD_LIBRARY_PATH中实现:
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
9. Qt 在调用动态链接库时涉及到类型转换应该怎么做
把QString转成QByteArray,然后再将QByteArray转换为char *(假如变量名为A)。
创建QByteArray用于接收输出结果,先扩充足够的空间,然后转换成char * (假如变量名为B)。
调用Encode(A,B,A.getLength())进行转换
把结果B转换成QString。
10. 请哪位来解释一下Qt静态编译和动态编译的区别
静态编译与动态编译的区别:
1、动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。
所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。
缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。