windows11第一个C++动态库

第一个C++动态库

1.动态库和静态库介绍

库是写好的,现有的,成熟的,可以复用的二进制代码,程序不可能都从头开始写,几乎所有程序都需要依赖很多基础的底层库。一般有静态库和动态库两种。

1.1静态库(后缀为.a或者.lib)

静态库在链接阶段,会将汇编生成的目标文件与引用到的库一起链接打包到可执行文件中,因此对应的链接方式称为静态链接。
静态库的特点:
1.静态库对函数库的链接是放在编译时期完成的。程序在运行时与函数库再无瓜葛,移植方便。
2.浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

1.2动态库(后缀为.so或者.dll)

动态库是在运行时动态加载到程序中的,因此生成的可执行文件并不包含库函数的实现代码,而只是引用了动态库的接口。
动态库特点:
1.多个程序可以共享同一个动态库,减少了系统的内存占用。
2.动态库可以独立于程序进行更新,因为动态库作为一个单独的文件存在于系统中,在程序运行是才被载入。

1.3总结

一般而言,如果需要多个程序共享同一个库,或者需要较少的内存占用,则使用动态库可能更为合适。如果需要保持部署和更新的稳定性,则静态库更为适合。

2win11动态库的编写

2.1开发环境

win11、VS2022、opencv4.7.0

2.2创建动态库

1.启动VS2022,点击创建新项目,在上面搜索框中输入dll,选择第一个。
在这里插入图片描述
2.修改项目名称为mydll05,点击创建即成功创建工程。
在这里插入图片描述
3.按照网上教程配置opencv开发环境。同时在右侧头文件中创建名为mydll05.h的头文件以及在源文件中创建mydll05.cpp的源文件。
在这里插入图片描述
4.mydll05.h 定义类,声明函数。

#pragma once
#ifdef MYDLL05_EXPORTS //预定义宏,VS2022已默认定义,名字为项目名称(MYDLL05)+_EXPORTS,在属性->C/C++->预处理器查看
#define DLLLIBRARY_API __declspec(dllexport)
#else
#define DLLLIBRARY_API __declspec(dllimport)
#endif
//__declspec(dllexport)和__declspec(dllimport)是DLL内的关键字,即导出与导入
//dllexport在类、函数以及数据的申明的时候使用,表明这些东西可以被外部函数使用。
// dllimport在外部程序需要使用DLL内相关内容的时使用,当外部程序要使用DLL 内部代码(类,函数,全局变量)。


class DLLLIBRARY_API MyClass
{
public:
	MyClass() {};//实现默认构造函数
	~MyClass() {};
	static void showimg(const char* imagePath);//声明函数
	static void print();

private:

};

extern DLLLIBRARY_API int add(int a, int b);//声明函数

5.mydll05.cpp 实现类和函数


#include "pch.h"
#include "framework.h"
#include "mydll05.h"
#include <iostream>
#include"framework.h"
#include <opencv2/opencv.hpp>  
using namespace std;

DLLLIBRARY_API void MyClass::showimg(const char* imagePath) {
    cv::Mat img = cv::imread(imagePath, cv::IMREAD_COLOR);
    if (!img.empty()) {
        // 在这里添加你的图像处理代码  
        // ...  
        cout << "test done" << endl;
        // 显示图像(仅用于演示,实际DLL中可能不需要)  
        cv::namedWindow("show image", cv::WINDOW_AUTOSIZE);
        cv::imshow("show image", img);
        cv::waitKey(0);
    }
}

DLLLIBRARY_API void MyClass::print(){
    cout << "显示图片测试" << endl;
}

DLLLIBRARY_API int add(int a, int b) {
    return a + b;
}

6.点击生成->重新生成解决方案运行,没有报错则表示动态库生成成功
在这里插入图片描述
7.生成的动态库文件保存在x64/Debug文件夹下,包含mydll05.dll和mydllo5.lib
在这里插入图片描述

3动态库函数的调用

3.1重新在VS2022创建一个新的的C++空项目,将上述生成的mydll05.dll和mydllo5.lib以及定义的mydll05.h头文件复制到新工程的源文件目录下。

3.2测试程序mian.cpp

#include"mydll05.h"
#include<string>
#include<iostream>
using namespace std;
//链接lib文件,需要dll文件和lib文件在当前目录
#pragma comment(lib,"mydll05.lib")

int main()
{
	MyClass Test;
	cout << add(2, 3) << endl;
	const char* imgpath = "bus.jpg";
	Test.showimg(imgpath);
	MyClass::print();
	return 0;
}

3.3测试结果

在这里插入图片描述

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值