00. 目录

文章目录

  • 00. 目录
  • 01. 开发环境
  • 02. Visual Studio 2019生成动态库
  • 03. 新建Qt项目
  • 04. 编写测试程序
  • 05. 其它参考
  • 06. 附录

01. 开发环境

Qt环境:Qt5.15 或者Qt6

VS环境:Visual Studio 2019

02. Visual Studio 2019生成动态库

03. 新建Qt项目

3.1 创建Qt纯C项目

3.2 将Visual Studio 2019生成的动态库相关文件和头文件拷贝到当前Qt项目所在的目录中。

3.3 右击Qt项目,选择添加库

3.4 选择外部库

3.5 设置外部库

3.6 添加头文件,选择对应的.h文件即可

04. 编写测试程序

程序示例

#include <stdio.h>#ifndef _MSC_VER
#include <unistd.h>
#endif#include <string.h>
#include <stdlib.h>
#include <errno.h>//包含Modbus相关头文件
#include "modbus.h"//相关参数设置
#define LOOP    1           //循环次数
#define ADDRESS_START   0   //测试寄存器起始地址
#define ADDRESS_END     99  //测试寄存器结束地址int main(void)
{modbus_t* ctx = NULL;int ret = -1;int nums = 0;int addr = 0;int i = 0;int tmp = 0;uint16_t* tab_rq_registers = NULL;uint16_t* tab_rp_registers = NULL;//设置随机种子srand((int)time(0));//1. 创建一个TCP类型的变量ctx = modbus_new_tcp("192.168.1.90", 10086);if (NULL == ctx){fprintf(stderr, "Error: %s\n", modbus_strerror(errno));return 1;}else{printf("设置TCP成功\n");}//2. 设置Debug模式ret = modbus_set_debug(ctx, TRUE);if (-1 == ret){fprintf(stderr, "Error: 设置Debug模式失败");modbus_free(ctx);return 1;}//3. 连接Serverret = modbus_connect(ctx);if (-1 == ret){fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return 1;}//4. 计算需测试的寄存器个数nums = ADDRESS_END - ADDRESS_START;//5. 申请内存 保存发送和接收的数据tab_rq_registers = (uint16_t*)malloc((nums + 1) * sizeof(uint16_t));if (NULL == tab_rq_registers){fprintf(stderr, "malloc failed\n");modbus_free(ctx);return 1;}else{memset(tab_rq_registers, 0, (nums + 1) * sizeof(uint16_t));}tab_rp_registers = (uint16_t*)malloc((nums + 1) * sizeof(uint16_t));if (NULL == tab_rp_registers){fprintf(stderr, "malloc failed\n");modbus_free(ctx);return 1;}else{memset(tab_rp_registers, 0, (nums + 1) * sizeof(uint16_t));}//7. 测试保持寄存器的单个读写//随机数字for (i = 0; i < nums; i++){tmp = rand() % 100;tab_rq_registers[i] = tmp;if (0 == i){printf("写入的值: ");}printf("%hd ", tab_rq_registers[i]);}//换行printf("\n");addr = ADDRESS_START;//先写入,后读取该数据到指定的内存中ret = modbus_write_and_read_registers(ctx, addr, nums + 1, tab_rq_registers,addr, nums + 1, tab_rp_registers);if (nums + 1 != ret){printf("Error modbus_write_and_read_registers: %d\n", ret);printf("Address: %d nums: %d\n", addr, nums + 1);}else{//输出for (i = 0; i < nums; i++){if (0 == i){printf("读取到的值: ");}printf("%hd ", tab_rp_registers[i]);}//换行printf("\n");}//再次读取数据memset(tab_rp_registers, 0, (nums + 1) * sizeof(uint16_t));ret = modbus_read_registers(ctx, addr, nums + 1, tab_rp_registers);if (nums + 1 != ret){printf("Error modbus_read_registers: %d\n", ret);}else{//输出for (i = 0; i < nums; i++){if (0 == i){printf("读取到的值: ");}printf("%hd ", tab_rp_registers[i]);}//换行printf("\n");}//8. 释放内存free(tab_rp_registers);free(tab_rq_registers);//9. 断开连接modbus_close(ctx);modbus_free(ctx);return 0;
}

执行结果

05. 其它参考

加载示例

# 请配置 Mysql 的包含库路径
win32:INCLUDEPATH  += "D:/Mysql/mysql-5.7.15-win32/include"
# 请配置 Mysql 的静态库路径
win32:LIBS += "-LD:/Mysql/mysql-5.7.15-win32/lib" -llibmysql

静态库标示符注意事项

-L :后面要跟的是lib文件的路径名,不可以有空格。

-l :后面跟的是要加载的静态库lib文件名,是文件名,不要加后缀名,要链接着写,别加空格。

Qt帮助文档
双击选中关键字 “LIBS” || “INCLUDEPATH” 按下键盘的F1键 调用 Qt自带的帮助文档。

加载不到静态库情形

空格路径

LIBS += “-LE:\Work For CEAC\joy_20161213\Code\External\bin” -lSystemModule_znjd

路径中存在空格时,务必用双引号引起来。

06. 附录

参考:Window下Qt无法加载动静态库解决方案

【Qt】Qt6调用Visual Studio2019生成的动态库详解相关推荐

  1. C++静态库与动态库详解与使用

    福利 | 百度 AI 开发者大会免费门票领取    CSDN日报20170628--<实习,背后的选择?>    [直播]探究Linux的总线.设备.驱动模型! C++静态库与动态库详解与 ...

  2. 静态库和动态库详解(部分参考别人)

    静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序 ...

  3. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  4. Linux下GCC生成和使用静态库和动态库详解(二)

    2.1准备好测试代码hello.h.hello.c和main.c: hello.h(见程序1)为该函数库的头文件. hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏 ...

  5. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  6. C++笔记 静态库和动态库详解

    定义:运行时库 静态库 动态库 运行时库:Unix中一个典型的运行时库例子就是libc,它包含标准的C函数,如,print(),exit()等等,用户能创建他们自己的运行库(在Windows中是DLL ...

  7. C++ 静态库和动态库 详解

    文章目录 前言 一.程序和进程 二.一个程序从源文件编译生成可执行文件的步骤 1.编译 2.链接 三.静态链接 四.动态链接 五.两者的区别 六.静态库和动态库的创建和使用 参考 前言 通过本文,你可 ...

  8. ModelSim SE 10.0a建立并调用Xilinx ISE 13.1仿真库详解

    从网上搜到的有很多,实践过其中几种,其中一种较简单的方法如下: 1)安装ModelSim 和ISE 并注册破解: 2)将ModelSim根目录下的modelsim.ini文件的只读属性去掉. 3)将c ...

  9. Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤

    1.  打开新立得包管理器,搜索JDK,选择openjdk-6-jdk安装: 2.  打开Ubuntu软件中心,搜索Eclipse,选择Eclipse集成开发环境,安装: 3.  打开Eclipse, ...

最新文章

  1. DtypeWarning: Columns (11,37) have mixed types.Specify dtype option on import or set low_memory=Fals
  2. mysql无法添加或更新子行_MySQL错误1452-无法添加或更新子行:外键约束失败?
  3. css 透明叠加_细品CSS(二)
  4. 自动化运维的正确姿势,你试了也会上瘾 | 社区福利
  5. (09)System Verilog 队列示例
  6. WAP PUSH介绍
  7. 多样加密功能全面升级细数猖獗作恶“五宗罪”
  8. 相片打印机原理_手机照片打印机的原理是什么 便携式照片打印机到底好不好...
  9. (一)C++游戏开发-本地存储-介绍
  10. 人在囧途之火车调研篇
  11. 西门子实数转整数_西门子PLC字整数与双字整数之间的转换、双整数与实数之间的转换...
  12. 3DsMax —布尔制作口红
  13. 【已解决】win10远程桌面连接报错:出现身份验证错误,要求的函数不受支持(CredSSP)
  14. IDM下载器 v6.38.20 最新中文版 免费的多线程下载工具
  15. 7-204 毕达哥拉斯三元组
  16. linux命令行界面上滑,获得Linux命令行平滑体验的5条技巧
  17. 31岁拿下阿里p7的offer,朋友都表示不屑,你怎么看?
  18. 1.MySQL面试宝典
  19. Flutter MaterialApp 和 Scaffold 组件
  20. 医院排班算法 护士排班法

热门文章

  1. UVALive 4254 Processor(二分)
  2. NYOJ541 最强DE 战斗力(第五届省赛试题)
  3. 有关 Nintendo GameCube
  4. 会导致所有者权益减少的项目是_第二章:会计要素的确认(11)所有者权益
  5. java:区间k大数查询
  6. 监测div大小变化_如何让div大小随窗口大小变化
  7. 最好的船_“船”说中的美丽陶瓷
  8. 6-3 逆序数据建立链表
  9. java画个半径为1地圆_java - 绘制一个半径为圆的圆并围绕边缘指向 - 堆栈内存溢出...
  10. Java黑皮书课后题第10章:*10.20(近似e)编程练习题5.26使用下面数列近似计算e(略),为了得到更好的精度,在计算中使用25位精度的BigDecimal