当前位置: 首页 > news >正文

中国网站的特点免费word文档模板下载网站

中国网站的特点,免费word文档模板下载网站,北京发布最新公告,wordpress thecorporationtheme目录 一、动态库生成 1#xff09;C语言生成动态库 2#xff09;c类生成动态库 二、动态库调用 1#xff09;Python调用DLL 2#xff09;QT调用DLL 三、存在的一些问题 1#xff09;python调用封装了类的DLL可能调用不成功 2#xff09;DLL格式不匹配的问题 四、…目录 一、动态库生成 1C语言生成动态库 2c类生成动态库 二、动态库调用 1Python调用DLL 2QT调用DLL 三、存在的一些问题 1python调用封装了类的DLL可能调用不成功 2DLL格式不匹配的问题 四、总结 动态库文件在程序开发中运用很常见但C和C代码生成动态库文件以及在使用时均存在一些差异本文对两者的差异进行了讲解并通过具体的实例加以说明。实例均在Windows系统下进行Linux系统下的实现一样。 一、动态库生成 1C语言生成动态库 我们直接新建一个记事本文件在文件中输入如下代码。写一个简单的加法函数函数返回相加的结果然后将记事本文件保存为myC.c文件名称随意扩展名为c。 #includestdio.hint add(int a, int b) { return ab; } 然后使用winr键 输入“cmd”打开命令窗口使用cd /d E:\Tem将工作目录切换到myC.c文件存放的E:\Tem路径下。如下图所示。 然后在命令行中输入gcc -shared -o myC.dll myC.c 执行该命令就可以在当前路径下得到动态库文件myC.dll。 2c类生成动态库 C是面向对象的编程语言代码文件一般包含.h头文件和.cpp文件。此处使用记事本分别新建两个文件命名为myclass.h和myclass.cpp。在文件中输入以下代码实现用一个整数创建一个类将整数赋给成员变量并可改变和返回该成员变量的值。 //头文件 // myclass.h #ifndef MYCLASS_H #define MYCLASS_H#ifdef BUILD_MYDLL #define MYDLL_API __declspec(dllexport) #else #define MYDLL_API __declspec(dllimport) #endifclass MYDLL_API MyClass { private:int value; public:MyClass(int val);~MyClass();int getValue();void setValue(int val); };// 封装 C 风格的接口函数 extern C {MYDLL_API MyClass* CreateMyClass(int val);MYDLL_API int GetValue(MyClass* obj);MYDLL_API void SetValue(MyClass* obj, int val);MYDLL_API void DestroyMyClass(MyClass* obj); }#endif //cpp文件 // myclass.cpp #include myclass.hMyClass::MyClass(int val) : value(val) {}MyClass::~MyClass() {}int MyClass::getValue() {return value; }void MyClass::setValue(int val) {value val; }extern C {MYDLL_API MyClass* CreateMyClass(int val) {return new MyClass(val);}MYDLL_API int GetValue(MyClass* obj) {return obj-getValue();}MYDLL_API void SetValue(MyClass* obj, int val) {obj-setValue(val);}MYDLL_API void DestroyMyClass(MyClass* obj) {delete obj;} } 在命令窗口中执行命令“g -shared -o myclass.dll -DBUILD_MYDLL myclass.cpp -Wl,--out-impliblibmyclass.a”可以得到编译完成后的dll文件。 -shared指定生成共享库DLL。 -o myclass.dll指定输出的 DLL 文件名。 -DBUILD_MYDLL定义宏使 MYDLL_API 被定义为 __declspec(dllexport)用于导出函数和类。 -Wl,--out-impliblibmyclass.a生成导入库文件。 二、动态库调用 1Python调用DLL ctypes是 Python 标准库中的一个外部函数库它提供了与 C 语言兼容的数据类型允许调用动态链接库DLL中的函数。在python中具体实现代码如下程序运行时需要将生成的myC.dll动态库复制到当前python程序文件所在路径下否则需要在下面文件路径中使用绝对路径。 import ctypes# 加载 myC.dll dll ctypes.CDLL(./myC.dll) dll.add.argtypes [ctypes.c_int, ctypes.c_int] # 定义函数参数和返回值类型 dll.add.restype ctypes.c_int a dll.add(2, 11) print(a) print(--------------------) 2QT调用DLL QT调用DLL有动态和静态两种方式。 1动态调用 动态调用需要使用到QT的QLibrary类此处以调用C生成的动态库为例具体代码如下。使用QLibrary类时只需要在代码中用QLibrary类加载相应的DLL文件并通过定义函数指针的方式取出需要使用的DLL函数。 在此例中调用DLL中的函数时首先需要使用DLL中的创建对象函数创建一个类的实例由于在调用时不能知道DLL类的结构因此采用QObject *来接收创建对象的指针。 #include QCoreApplication #include QLibrary #include QDebug #include QObjectint main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QLibrary myLib(E:/Tem/useDLL/myclass.dll);if (myLib.load()) {// 定义函数指针类型typedef QObject* (*creatFunction)(int);creatFunction create (creatFunction)myLib.resolve(CreateMyClass);if (create) {// 调用函数QObject* obj create(3);//创建对象typedef int (*getFunction)(QObject*);getFunction get (getFunction)myLib.resolve(GetValue);int val get(obj);qDebug() The get is: val;typedef void (*setFunction)(QObject*,int);setFunction set (setFunction)myLib.resolve(SetValue);set(obj,100);val get(obj);qDebug() The set is: val;typedef void (*desFunction)(QObject*);desFunction des (desFunction)myLib.resolve(DestroyMyClass);des(obj);qDebug() obj has been deleted.;} else {qDebug() Failed to resolve the function.;}}return a.exec(); } 上述代码执行结果 2静态调用DLL 当使用静态调用方法时需要将生成的DLL动态库和对应的.h头文件拷贝到工程目录下。然后在工程的.pro文件中添加代码“LIBS -L../ -lmyclass”在.cpp文件中包含DLL的头文件然后就可以正常使用DLL了。具体实现代码如下。 #include QCoreApplication #include myclass.h //包含DDL的头文件 //#include QLibrary #include QDebug #include QObjectint main(int argc, char *argv[]) {QCoreApplication a(argc, argv);MyClass my(3);qDebug()my.getValue();my.setValue(5);qDebug()my.getValue();return a.exec(); } 上述程序输出结果为 三、存在的一些问题 1python调用封装了类的DLL可能调用不成功 从DLL的生成可知c和c代码生成DLL在代码实现上是不一样的c代码需要使用到 extern C和“__declspec(dllexport)”。在使用python调用封装了c类的动态库时会出现ctypes.CDLL()加载动态库文件不成功的情况经过测试发现是因为在DLL的函数中使用了new关键字实例化对象造成的但是具体的原因不清楚。若改用直接申明对象的方式将对象的指针返回但是在python中传递该指针后调用函数时会存在访问非法或访问不到类中变量问题。而同样的DLL文件在QT中调用是完全没有问题的。 2DLL格式不匹配的问题 在调用DLL时可能存在格式不匹配的问题这个可能是因为使用的gcc编译器版本不同或者32位与64位不兼容的原因。应确保DLL库的编译工具与调用它的程序使用相同的gcc避免兼容性问题。一些比较常用的64位gcc版本可以在这里下载。 四、总结 DLL动态库方便程序模块化开发但是在进行跨语言调用时最好只在DLL中封装相应的实现函数而不要跨语言调用类的实现避免一些不可预测的问题。
http://www.hkea.cn/news/14373657/

相关文章:

  • 网站怎么做百科网站备案 域名过期
  • 网站 语言切换怎么做app和小程序的区别
  • 手机 网站 开发linode wordpress建站
  • 做彩票网站程序违法吗黑龙江省住房与建设厅网站
  • 做网站南京获取网站浏览者手机号
  • 嘉定网站建设公司视频号怎么付费推广
  • 保定建设网站设计公司介绍模板
  • 运城网站建设运城天气wordpress文章密码爆破
  • 做网站用哪个eclipse情感营销
  • 网站制作网站模板网站建设著作权
  • 企业网站样式政务网站安全建设工作计划
  • 建站优化易下拉系统yy直播间
  • 出名的网站有哪些化妆品购物网站模板
  • 网站建设电网站推广的手段
  • 国外优秀网站小程序制作要求
  • 北京平台网站建设费用信息发布的网站怎么做
  • 哪里找专业做网站的公司网站设计制作策划书
  • 企业网站的作用和意义成绩查询
  • 网上有做口译的网站么网站建设运行环境
  • 好推建站多平台网页制作
  • 如何做旅游小视频网站企业年金个人查询
  • 网站开发服务器wordpress最新版新建页面选择模板
  • 网站建设 空间什么系统免费素材库
  • 婚庆公司网站搭建dedecms 生成网站地图
  • 运城做网站的公司宿迁网站制作公司
  • 网站开发什么技术网站跳转怎么做360
  • 专业做俄语网站建设伍佰亿网站怎么做
  • 河北网站建设市面价陕西省城乡住房建设部网站
  • 怎样查询网站的备案号电子商务网站建设名词解释
  • 外贸网站 seo项目建设程序