C++封装dll和lib 供C++调用

头文件interface.h

#pragma once
#ifndef INTERFACE_H
#define INTERFACE_H
#define _CRT_SECURE_NO_WARNINGS
#define FENGZHUANG_API _declspec(dllexport)
#include <string>
namespace FengZhuang {class FENGZHUANG_API IInterface {public:static IInterface* CreateInterface();virtual void Init() = 0;virtual void Destroy() = 0;virtual const char* GetName() = 0;virtual void Log(int index, const std::string& windowName, bool includeDate,const char* format, ...) = 0;};
}
#endif

source.cpp文件:

#include "interface.h"
#include <iostream>
#include <ctime>
//以下是log里面需要的头文件
#include <fstream> //打开写入std::ofstream file 需要的
#include <chrono> //std::chrono 获取时间需要的
#include <cstdarg>//va_start需要的头文件namespace FengZhuang {class FHello : public IInterface {public:FHello();void Init() override;void Destroy() override;const char* GetName() override;void Log(int index, const std::string& windowName, bool includeDate,const char* format, ...) override;private:char name[1024];};FHello::FHello(){memset(name, 0, 1024);strcpy(name, "hello");}void FHello::Init(){printf("FHello::Init\n");}void FHello::Destroy(){printf("FHello::Destroy\n");}const char* FHello::GetName() {return "FHello";}void FHello::Log(int index, const std::string& windowName, bool includeDate,const char* format, ...) {std::string filename = std::to_string(index) + windowName + ".txt";// 打开文件以追加写入日志std::ofstream file(filename, std::ios::app);if (!file.is_open()){std::cerr << "无法打开日志文件:" << filename << std::endl;return;}// 获取时间戳auto now = std::chrono::system_clock::now();std::time_t currentTime = std::chrono::system_clock::to_time_t(now);std::tm timeInfo;
#ifdef _WIN32localtime_s(&timeInfo, &currentTime);
#elselocaltime_r(&currentTime, &timeInfo);
#endifchar timeBuffer[128];if (includeDate){//std::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %T", &timeInfo);//%T ==%H:%M:%Sstd::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %H:%M:%S", &timeInfo);}else{//std::strftime(timeBuffer, sizeof(timeBuffer), "%T", &timeInfo);std::strftime(timeBuffer, sizeof(timeBuffer), "%H:%M:%S", &timeInfo);}// 格式化日志消息va_list args;va_start(args, format);char buffer[256];vsnprintf(buffer, sizeof(buffer), format, args);va_end(args);// 在控制台和文件中输出日志消息std::printf("%s %s", timeBuffer, buffer);file << timeBuffer << " " << buffer;}IInterface* IInterface::CreateInterface(){return new FHello();}
} // namespace FengZhuang

下面是自己项目内测试代码:

int main() {FengZhuang::IInterface* IF = FengZhuang::IInterface::CreateInterface();IF->Destroy();IF->Log(1, "窗口1", 1, " %d行 窗口:%s x:%d \n", __LINE__, "窗口1", 123);delete IF;
}

其他C++使用者调用方法;

设置库需要3步
1.VC++目录-外部包含目录,添加外部库目录,就是库的头文件 #include "interface.h"的位置
2.VC++目录-库目录,
3.连接器–附加依赖项,就是lib库的名称

#include "interface.h"
int main() {FengZhuang::IInterface* IF = FengZhuang::IInterface::CreateInterface();IF->Init();IF->Destroy();IF->Log(1,"窗口1",0," %d行 窗口:%s x:%d \n",__LINE__, "窗口1",123);delete IF;return 0;
}

成功调用!!这是C++可以调用的方式,还要写个C和易语言以及python可以调用的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node——npm包管理器的使用

Node.js使用npm对包进行管理&#xff0c;其全称为Node Package Manager&#xff0c;开发人员可以使用它安装、更新或者卸载Node.js的模块 1、npm包管理器基础 1.1、npm概述 npm是Node.js的标准软件包管理器&#xff0c;其在2020年3月17日被GitHub收购&#xff0c;而且保证永…

机器学习笔记 - 3D对象检测技术路线调研(未完)

一、3D对象检测简述 3D对象检测是计算机视觉中的一项任务&#xff0c;其目标是根据对象的形状、位置和方向在 3D 环境中识别和定位对象。它涉及检测物体的存在并实时确定它们在 3D 空间中的位置。这项任务对于自动驾驶汽车、机器人和增强现实等应用至关重要。 1、基本流程 给定…

虾皮买手号怎么弄的

想要拥有虾皮买手号&#xff0c;可以使用shopee买家通系统进行自动化注册&#xff0c;这款软件目前支持菲律宾、泰国、马来西亚、越南、巴西、印度尼西亚等国家使用。 软件注册流程简单方便&#xff0c;首先我们需要先准备好手机号&#xff0c;因为现在注册虾皮买家号基本上都是…

UI自动化的基本知识

一、UI自动化测试介绍 1、什么是自动化测试 概念&#xff1a;由程序代替人工进行系统校验的过程 1.1自动化测试能解决的问题&#xff1f; 回归测试 (冒烟测试) 针对之前老的功能进行测试 通过自动化的代码来实现。 针对上一个版本的问题的回归 兼容性测试 web实例化不同的浏…

C语言基础篇5:指针(一)

指针是C语言的核心、精髓所在&#xff0c;用好了指针可以在C语言编程中起到事半功倍的效果。指针一方面可以提高程序的编译效率和执行速度&#xff0c;而且还可以通过指针实现动态的存储分配&#xff0c;另一方面使用指针可使程序更灵活&#xff0c;便于表示各种数据结构&#…

力扣labuladong——一刷day57

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣1379. 找出克隆二叉树中的相同节点二、力扣LCR 143. 子结构判断三、力扣110. 平衡二叉树四、力扣250. 统计同值子树 前言 有些题目&#xff0c;你按照拍…

LeetCode Hot100 236.二叉树的最近公共祖先

题目&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节…

HT97220与HT97230耳机放大器芯片对比

HT97230有两个不同开启时间(tON)版本&#xff0c;版本A、C和E的导通时间tON为5.5ms&#xff0c;用于耳机驱动&#xff1b;B和D则具有130ms的tON&#xff0c;用于机顶盒设计&#xff08;目前仅提供A版本&#xff0c;其他版本需预定&#xff09;。内部电荷泵对输入电源反相&#…

05 在C++中,什么是变量?变量有哪些类型?

系列文章目录 在C中&#xff0c;什么是变量&#xff1f;变量有哪些类型&#xff1f; 目录 系列文章目录 文章目录 前言 一、C中的变量 1.什么是变量&#xff1f; 2.变量的类型 二、C 中的变量定义和声明 1.变量定义 2.变量声明 三、扩展 1.函数 2.自动转换规则 总…

accelerate的使用说明

1 多卡(GPU)使用方法 终端输入指令&#xff0c;生成问答页面 accelerate config 这个方法也是可以的 2 后面修改直接找到这个yaml文件进行修改即可 cd ~/.cache/huggingface/accelerate vim default_config.yaml 进入vim进行修改 3 单卡(GPU)使用方法 vim default_config.…

什么是SQL?

SQL和MySQL是当今计算机领域中非常重要的两个概念。SQL是关系型数据库的查询语言&#xff0c;而MySQL是一种关系型数据库管理系统。它们在数据存储、管理和查询方面发挥着巨大的作用。在本文中&#xff0c;我们将深入探讨SQL和MySQL的定义、功能、应用以及它们之间的联系。 一…

边缘计算网关:智能制造的“智慧大脑”

一、智能制造的崛起 随着科技的飞速发展&#xff0c;智能制造已经成为了制造业的新趋势。智能制造不仅能够提高生产效率&#xff0c;降低生产成本&#xff0c;还能够实现个性化定制&#xff0c;满足消费者多样化的需求。然而&#xff0c;智能制造的实现离不开大量的数据处理和分…

2023.11.25电商项目平台建设2 -四大业务之核销主题建模

1.数仓建模步骤 自下而上 ADS-DWS-DWM-DWD 2.DWD方案(清洗转换,降维拉宽) DWD层的表 dwd_sale_store_sale_dtl_i 门店销售明细宽表 维度dim 销售sale合成成的宽表 dwd_dim_date_f 日期表 store_sale_dtl 门店销售明细表 dwd_sale_store_sale_dtl_i 门店销售明细表 …

快速上手Banana Pi BPI-R4 MediaTek MT7988A 开源路由器开发板

基础开发 准备开发 * 准备8G以上TF卡、USB转串口线、Ubuntu系统* 使用 USB 串行电缆&#xff08;3.3V TTL&#xff0c;波特115200&#xff09;连接到 BPI-R4 上的调试控制台G接地&#xff1b;RXBPI-R4输入&#xff1b;TXBPI-R4输出* BPI-R4 引导程序和设备选择跳线设置* 例子…

【leetcode】62. 不同路径

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; …

基于SpringBoot的超市信息管理系

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着我国经济的不断发…

数据库日志解析:深入了解MySQL中的各类日志

**> &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 数据库日志解析&#xff1a;深入了解MySQL中的各类日志 前言第一&#xff1a;错误日志❌1. 错误日志的作用2. 记录内容3. 故障排查的方法 第二&#xff1a;查询日志1.…

【华为OD】B\C卷真题 100%通过:需要打开多少监控器 C/C++实现

【华为OD】B\C卷真题 100%通过&#xff1a;需要打开多少监控器 C/C实现 目录 题目描述&#xff1a; 示例1 代码实现&#xff1a; 题目描述&#xff1a; 某长方形停车场&#xff0c;每个车位上方都有对应监控器&#xff0c;当且仅当在当前车位或者前后左右四个方向任意一个…

【Linux】第二十站:模拟实现shell

文章目录 一、shell的实现细节1.shell的一些细节2.用户名、主机名、工作目录2.输入命令3.改为循环4.切割字符串5.普通命令的执行6.内建命令的处理7.子进程的退出码8.总结 二、模式实现shell完整代码 一、shell的实现细节 1.shell的一些细节 shell操作系统的一个外壳程序。 s…

笔记:pycharm当有多个plt.show()时候,只显示第一个plt.show()

import matplotlib.pyplot as plt import numpy as np# 创建数据 x np.linspace(0, 10, 100) y1 np.sin(x) y2 np.cos(x) y3 np.tan(x) y4 np.exp(x)# 创建一个2x2的子图网格 # fig plt.figure() fig,((ax1, ax2), (ax3, ax4)) plt.subplots(nrows2, ncols2, figsize(8,…