QtQt6调用Visual Studio2019生成的动态库详解

Posted 沧海一笑-dj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QtQt6调用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无法加载动静态库解决方案

以上是关于QtQt6调用Visual Studio2019生成的动态库详解的主要内容,如果未能解决你的问题,请参考以下文章

如何在Visual Studio和CodeBlocks中反编译C++代码

visual studio 2019创建项目报错:对com组件的调用返回了错误hresult_fail(未解决)

visual studio 2019创建项目报错:对com组件的调用返回了错误hresult_fail(未解决)

Visual Studio 2019 C# Hotkey 用于查看函数的应用

Visual Studio 2019 密钥 Visual Studio 2019序列号 Visual Studio 2019 永久激活工具

visual studio 2008如何引用dll