qt怎么qt 调用c动态库3d模型动态库

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Linux环境使用qtcreator编程实现动态加载动态链接库
摘要:完整的工程源码可以访问下载:http://download.csdn.net/download/libaineu一、主程序main.cpp#include&iostream&#include&dlfcn.h&typedefint(*pStrLenFun)(char*str);typedefchar*(*pStrCopyFun)(char*desc,char*src);intmain(intar
完整的工程源码可以访问下载:http://download.csdn.net/download/libaineu
一、主程序main.cpp
#include &iostream&#include &dlfcn.h&
typedef int (*pStrLenFun)(char *str);
typedef char *(*pStrCopyFun)(char *desc, char *src);
int main(int argc, char *argv[])
&&& char src[]=&Hello Dymatic&;
&&& char desc[80];
&&& pStrLenFun fun1;
&&& pStrCopyFun fun2;
&&& void *phandle = NULL;
&&& char *perr = NULL;
&&& phandle = dlopen(&libslstrlen.so&, RTLD_LAZY);//RTLD_NOW
&&& if(!phandle)
&&&&&&& printf(&Failed Load library!/n&);
&&& perr = dlerror();
&&& if(perr != NULL)
&&&&&&& printf(&%s/n&,perr);
&&&&&&& return 0;
&&& fun1 = (pStrLenFun)dlsym(phandle, &StrLen&);
&&& perr = dlerror();
&&& if(perr != NULL)
&&&&&&& printf(&%s/n&,perr);
&&&&&&& return 0;
&&& fun2 = (pStrCopyFun)dlsym(phandle, &StrCopy&);
&&& perr = dlerror();
&&& if(perr != NULL)
&&&&&&& printf(&%s/n&,perr);
&&&&&&& return 0;
&&& printf(&The string is: %s/n&,src);
&&& printf(&the string length is: %d/n&,fun1(src));
&&& printf(&the string copyed:%s/n&,fun2(desc,src));
&&& return 0;
相应的go.pro文件
TEMPLATE = appCONFIG += console c++11CONFIG -= app_bundleCONFIG -= qtDESTDIR = ../binQMAKE_LFLAGS += -ldl #编译选项,否则会失败。comile option,dlopen()#如果程序员想在QtCretor直接运行并动态加载动态库的话,则需要添加好该库,否则会报错。#Failed Load library!#libslstrlen.so: cannot open shared object file: No such file or directoryLIBS += -L../bin/ -lslstrlenSOURCES += main.cpp
二、动态库
源文件slstrlen.cpp
#include &slstrlen.h&#define ENDSTRING '/0'int StrLen(char *string){& int len = 0;& while(*string++ != ENDSTRING)&&& len++;&}char *StrCopy(char *desc, char *src){&&& return 0;}头文件slstrlen.h
#ifndef SLSTRLEN_H#define SLSTRLEN_H#include &slstrlen_global.h&//如果动态库使用g++编译,那么动态库定义函数的时候加上extern &C&,否则会提示undefined symbol错误。extern &C& int SLSTRLENSHARED_EXPORT StrLen(char *string);extern &C& char * SLSTRLENSHARED_EXPORT StrCopy(char *desc, char *src);#endif // SLSTRLEN_H头文件slstrlen_global.h
#ifndef SLSTRLEN_GLOBAL_H#define SLSTRLEN_GLOBAL_H//#include &QtCore/qglobal.h&#define Q_DECL_EXPORT&&&& __attribute__((visibility(&default&)))#define Q_DECL_IMPORT&&&& __attribute__((visibility(&default&)))#define Q_DECL_HIDDEN&&&& __attribute__((visibility(&hidden&)))#if defined(SLSTRLEN_LIBRARY)#& define SLSTRLENSHARED_EXPORT Q_DECL_EXPORT#else#& define SLSTRLENSHARED_EXPORT Q_DECL_IMPORT#endif#endif // SLSTRLEN_GLOBAL_Hslstrlen.pro文件
#-------------------------------------------------## Project created by QtCreator T14:58:54##-------------------------------------------------QT&&&&&& -= core guiTARGET = slstrlenTEMPLATE = libDESTDIR = ../binDEFINES += SLSTRLEN_LIBRARY# The following define makes your compiler emit warnings if you use# any feature of Qt which as been marked as deprecated (the exact warnings# depend on your compiler). Please consult the documentation of the# deprecated API in order to know how to port your code away from it.DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.# In order to do so, uncomment the following line.# You can also select to disable deprecated APIs only up to a certain version of Qt.#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000&&& # disables all the APIs deprecated before Qt 6.0.0SOURCES += slstrlen.cppHEADERS += slstrlen.h/&&&&&&& slstrlen_global.hunix {&&& target.path = /usr/lib&&& INSTALLS += target}
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Linux环境使用qtcreator编程实现动态加载动态链接库相关信息,包括
的信息,所有Linux环境使用qtcreator编程实现动态加载动态链接库相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
InternationalQT5编写和调用DLL动态库的终极实践_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
QT5编写和调用DLL动态库的终极实践
&&QT5编写和调用DLL动态库的终极实践
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩5页未读,
定制HR最喜欢的简历
你可能喜欢Qt 创建和使用动态链接库 - cibiren2011的专栏
- 博客频道 - CSDN.NET
我的图书馆
Qt 创建和使用动态链接库 - cibiren2011的专栏
- 博客频道 - CSDN.NET
一、创建共享库1、新其他建项目,选择C++库2、选择共享库,并取项目名称,单击下一步。这里取名位mylib3、按默认配置单击下一步至模块选项,选择所需支持的模块。这里勾选Qtcore和QtGui。4、直接下一步至完成。现在一个共享库的工程就新建好了。5、右击项目添加新文件,选择Qt设计师界面,以便支持可视化界面设计。6、进入可视化界面设计,修改objectName为Mylib7、修改mylib.h文件,代码如下:[cpp] #ifndef&MYLIB_H &&#define&MYLIB_H &&#include&'mylib_global.h'&&#include&&QDialog& &&namespace&Ui&&{&&&&class&M&&}&&class&MYLIBSHARED_EXPORT&Mylib&:public&QDialog&&{&&public:&&&&Mylib(QWidget&*parent&=&0);&&private:&&&&Ui::Mylib&*&&};&&#endif&//&MYLIB_H&&[cpp] #ifndef&MYLIB_H&&#define&MYLIB_H&&#include&'mylib_global.h'&&#include&&QDialog&&&namespace&Ui&&{&&&&class&M&&}&&class&MYLIBSHARED_EXPORT&Mylib&:public&QDialog&&{&&public:&&&&Mylib(QWidget&*parent&=&0);&&private:&&&&Ui::Mylib&*&&};&&#endif&//&MYLIB_H&&#ifndef MYLIB_H#define MYLIB_H#include 'mylib_global.h'#include &QDialog&namespace Ui{
class M}class MYLIBSHARED_EXPORT Mylib :public QDialog{public:
Mylib(QWidget *parent = 0);private:
Ui::Mylib *};#endif // MYLIB_H8、修改mylib.cpp文件,代码如下:[cpp] #include&'mylib.h' &&#include&'ui_mylib.h' &&Mylib::Mylib(QWidget&*parent):&&&&QDialog(parent),&&&&ui(new&Ui::Mylib)&&{&&&&ui-&setupUi(this);&&}&&[cpp] #include&'mylib.h'&&#include&'ui_mylib.h'&&Mylib::Mylib(QWidget&*parent):&&&&QDialog(parent),&&&&ui(new&Ui::Mylib)&&{&&&&ui-&setupUi(this);&&}&&#include 'mylib.h'#include 'ui_mylib.h'Mylib::Mylib(QWidget *parent):
QDialog(parent),
ui(new Ui::Mylib){
ui-&setupUi(this);}9、右键单击项目,选择构建项目'mylib'。如果没有错误,构建成功后会在Debug文件夹下出现这三个文件。mylib.dll即为后面要使用到的共享库,libmylib.a是Linux下使用的库。至此,已生成了要使用的共享库。二、共享库的使用现在需要新建一个工程来调用我们刚才生成的共享库。这里我创建了一个名为libtest的Dialog工程。1、修改工程文件libtest.pro,在文件尾添加如下代码:[cpp] INCLUDEPATH&+=&../&&&LIBS&+=&../debug/lib.dll&&&[cpp] INCLUDEPATH&+=&../&&&LIBS&+=&../debug/lib.dll&&&INCLUDEPATH += ../ LIBS += ../debug/lib.dll INCLUDEPATH&这一行就是为了让我们的&libtest&项目可以找到&mylib.h&和&mylib_global.h&这两个文件,你需要把这里的路径替换成符合你的工程的路径。LIBS&这一行则需要告诉编译器(注意,这里是编译器!)到哪里去找到这个&dll&文件。这里,我的路径为:[cpp] INCLUDEPATH&+=&I:\Qt\MyProjects\mylib&&LIBS&+=&I:\Qt\MyProjects\mylib\debug\mylib.dll&&&[cpp] INCLUDEPATH&+=&I:\Qt\MyProjects\mylib&&LIBS&+=&I:\Qt\MyProjects\mylib\debug\mylib.dll&&&INCLUDEPATH += I:\Qt\MyProjects\mylibLIBS += I:\Qt\MyProjects\mylib\debug\mylib.dll 2、在dialog中添加一个button,单击button时调用共享库。修改dialog.cpp文件,代码如下:[cpp] #include&'dialog.h' &&#include&'ui_dialog.h' &&#include&'mylib.h' &&Dialog::Dialog(QWidget&*parent)&:&&&&QDialog(parent),&&&&ui(new&Ui::Dialog)&&{&&&&ui-&setupUi(this);&&}&&Dialog::~Dialog()&&{&&&&delete&&&}&&void&Dialog::on_pushButton_clicked()&&{&&&&Mylib&w;&&&&w.show();&&&&w.exec();&&}&&[cpp] #include&'dialog.h'&&#include&'ui_dialog.h'&&#include&'mylib.h'&&Dialog::Dialog(QWidget&*parent)&:&&&&QDialog(parent),&&&&ui(new&Ui::Dialog)&&{&&&&ui-&setupUi(this);&&}&&Dialog::~Dialog()&&{&&&&delete&&&}&&void&Dialog::on_pushButton_clicked()&&{&&&&Mylib&w;&&&&w.show();&&&&w.exec();&&}&&#include 'dialog.h'#include 'ui_dialog.h'#include 'mylib.h'Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog){
ui-&setupUi(this);}Dialog::~Dialog(){}void Dialog::on_pushButton_clicked(){
w.exec();}3、此时运行一下,会是什么效果呢?什么都没有!提示[cpp] I:\Qt\MyProjects\libtest\debug\libtest.exe&启动中...&&I:\Qt\MyProjects\libtest\debug\libtest.exe&退出,&代码:&-&&[cpp] I:\Qt\MyProjects\libtest\debug\libtest.exe&启动中...&&I:\Qt\MyProjects\libtest\debug\libtest.exe&退出,&代码:&-&&I:\Qt\MyProjects\libtest\debug\libtest.exe 启动中...I:\Qt\MyProjects\libtest\debug\libtest.exe 退出, 代码: -找到libtest工程目录下的libtest.exe,双击运行,弹出没有找到mylib.dll?不是使用&LIBS&指定了吗?请注意,我们强调了,这个指定是编译期的。dll&是动态链接库,也就是说,在&exe&运行的时候需要找到这个库。运行时查找的顺序是:当前路径&-&&系统路径(通常是&system32)。所以,要把我们先前生成的这个&mylib.dll&复制到&exe&所在目录,然后直接双击一下这个&exe&文件。程序运行如下单击Mylib&test按钮,共享库mylib的dialog也弹出来啦~~~到这里,共享库的使用也成功了。三、更新dll也许有人要问了,共享库的创建和使用都这么麻烦,用它有什么好处呢。共享库的一个好处是可以动态加载,也就是说,如果你需要升级程序,那么就要简单的替换掉这个&dll&就好了,不需要要求用户重新安装全部文件。当然,这些&dll&也是有缺点的:动态加载的东西肯定会比静态编译的东西效率低一些。不过在现在的硬件环境下,这点性能损失已经可以忽略不计了。好,那么我们现在来体验一下如何更新dll来达到升级程序的目的。1、修改mylib.cpp,在共享库的dialog中添加一个button。2、右键单击项目mylib,选择重新构建项目'mylib'3、将libtest项目目录下的mylib.dll替换新的mylib.dll。4、运行libtest.exe这时单击Mylib&test按钮,效果如何呢?至此,我们在没有修改程序的情况下,通过替换dll达到了改变程序运行效果的目的。也就是说我们可以通过更新dll文件来完成对程序的升级了。
喜欢该文的人也喜欢qt调用动态库注意点
创建动态库的时候注意点:
1、 创建动态库后,想要建立一个新的类,那么一定要在类的头文件 class 前加入***(工程名)SHARED_EXPORT。
调用动态库注意点:
1、 确认动态库是否和本项目使用同一个编译器编译的,以及在build的时候注意,如果项目是build Debug模式下,那么调用的动态库也必须是build Debug编译的,必须对应。(如果项目需要调试,那么调用build Debug编译的动态库,等程序发布的时候,重新修改pro文件导入release版的动态库,在发布)。
2、 调用动态库有两种方法
尝试了在Qt调用VS动态库的2种方法:显式加载和隐式加载。Qt版本采用5.1,使用的默认编译器gcc;VS使用2010。详细过程如下:
(1)在VS2010中导出动态库,导出过程未使用windows平台相关的代码。
1 /***************************************
2 * MyDll.h
3 ***************************************/
4 #ifndef MYDLLEXPORT
5 #define MYDLLEXPORT extern "C" __declspec(dllimport)
9 MYDLLEXPORT int
add(int a, int b);
10 MYDLLEXPORT int
/***************************************
* DllDemo.cpp
***************************************/
4 #define MYDLLEXPORT extern "C" __declspec(dllexport)
5 #include "MyDll.h"
g_nCount = 0;
9 int add(int a, int b){
return (g_nCount += a + b);
编译后生成2个文件:DllDemo.lib,DllDemo.dll。
(2)Qt中实现调用
  不同调用方式需要的文件不同,对于显式加载只需要*.dll;隐式加载需要*.h,*.dll。这里只贴出部分代码如下:
显式  显式调用需要将*.dll文件复制到生成目录的执行文件所在路径下(.exe所在),注意的是Qt Creator中生成目录是在源码目录外的。然后在代码中Load。
1 QLibrary lib("DllDemo"); // 不需要后缀
2 if (lib.load())
typedef int(*AddFunction)(int a,int b);
AddFunction Add=(AddFunction)lib.resolve("add");
int res = Add(20, 155);
ui-&lineEdit-&setText(QString("%1").arg(res));
隐式  隐式加载时在*.pro手动添加:LIBS+=DllDemo.dll,然后倒入所需头文件,在调用处包含并调用其中的接口即可。
1 /***************************************
* LIBS += DllDemo.dll
***************************************/
4 #include "MyDll.h"
5 // 隐式调用
6 int res = add(20, 155);
ui-&lineEdit-&setText(QString("%1").arg(res));
  以上过程中调用动态库只是简单的C函数,关于C++类或包含win32的导出库待后研究......
没有更多推荐了,如何用qt在linux中编写并使用动态链接库_百度知道
如何用qt在linux中编写并使用动态链接库
我有更好的答案
先写好实现动态链接库的libmy.cpp文件和libmy.h文件,如下:// libmy.cpp#include&libmy.h&&#include&iostream&MyLib::MyLib()&{&}MyLib::~MyLib()&{&}&&void MyLib::hello()&{&&&&&&cout && &hello world~!& &&}// libmy.h文件#ifndef& LIBMY_H&#define& LIBMY_H&&class MyLib{&public:&&&&&&MyLib();&&&&&&~MyLib();&&&&&&&&void hello();&};&#endif& /*LIBMY_H*/&然后写好pro文件,如下:TEMPLATE = lib&TARGET =DllTestHEADERS += libmy.h&SOURCES += libmy.cpp保存关闭,文件名命名为MyDll.pro在Shell里执行qmake MyDll.pro,在没有错误的情况下,然后执行make ,可以看到生成了几个后缀名为so的文件,如下图:证明生成动态链接库成功。然后编写测试动态链接库的主函数,如下:#include&libmy.h&&#include&iostream&int main(int argc,char *argv[])&{&&&&&&&&&&& MyLib *lib = new MyLib();&&&&&&&// 调用刚才编写的动态链接库&&&&&& lib-&hello();&&&&&&&&&&&&&&&& cout && &danshiming & &&&&&&&&&&&&&&&& cin &&&&&&& &return 1;&}编写main.pro文件,如下:LIBS += -L ./&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 设置程序查找动态库的目录为当前目录&# 注意:用QT生成的动态库默认都加了lib前缀和扩展名及版本名,但调用时不用加lib,不用加文件# 扩展名so、不用加版本名1.0.0.即下面LIBS中的DllTest就是实际的动态库libDllTest.so.1.0.0LIBS+=-lDllTest&&#注意:调用时不用加lib,不用加文件扩展名so、不用加版本名1.0.0,记得前面加l(字母)TARGET = libMyTest&&&&&&&&SOURCES += main.cpp执行qmake main.pro生成makefile文件,然后执行make,可以看到生成了libMyTest可执行文件。将动态链接库libDllTest.so.1.0.0和可执行文件传到arm板上,如下:&在arm板上执行libMyTest,如下:# chmod +x& libMyTest&&& // 先赋予可执行权限执行:#& ./libMyTest&输出如下:
采纳率:95%
来自团队:
举个例子,就容易理解了。//libmy.h #ifndef
LIBMY_H#define
LIBMY_H #include
&QObject& class MyLib : public QObject{public:
void hello();};#endif
/*LIBMY_H*///libmy.cpp #include
&libmy.h&#include
&QtDebug& MyLib::MyLib(){} MyLib::~MyLib(){} void MyLib::hello(){
qDebug() && &hello world~!&;}//libmy.pro ####################################################################### Automatically generated by qmake (2.01a) ?? 11? 7 17:17:14 2012###################################################################### TEMPLATE = libTARGET = myDEPENDPATH += . srcINCLUDEPATH += . src # InputHEADERS += src/libmy.hSOURCES += src/libmy.cpp//libmy.pc prefix=/usrexec_prefix=${prefix}libdir=${exec_prefix}/libincludedir=${prefix}/include/ Name: libmyDescription: libmy testVersion: 0.1Requires:Libs: -L${libdir} -lmyCflags: -I${includedir}以上是编写库的demo//main.cpp #include
&libmy.h&#include
&QApplication& int main(int argc,char *argv[]){
QApplication app(argc,argv);
MyLib *lib = new MyLib();
lib-&hello();
app.exec();
return 0;}在main.cpp的pro文件中,添加CONFIG += link_pkgconfigPKGCONFIG += libmy连接到刚才编译的libmy库,
本回答被提问者和网友采纳
为您推荐:
其他类似问题
动态链接库的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 qt 调用 java 的文章

 

随机推荐