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

00. 目录

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. 连接Server
	ret = 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无法加载动静态库解决方案

© 版权声明
THE END
喜欢就支持一下吧
点赞153 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容