C++ 基础(五)使用vs2015封装c++生成.dll文件、.lib文件、.h文件后,给另一个工程使用:使用前,需配置头文件(.h)静态库(.lib)和 动态库(.dll )项目属性

一、简介

我是一个认真的人,要么不写,要么我就把步骤、截图、代码,一 一 附上,方便大家参考学习。

1、为什么要生成DLL和lib?

     就是为了给VS工程调用(比如C#调用、C++工程)。

2、C#为什么要调用DLL和lib?

C++写的程序,只能通过DLL的形式给C#调用。

3、如果我能在C++就能完成工作,需要用C#来写程序吗?

   不需要,因为C++效率要比C#效率高。但是安全性比不上C#。原因是C++非托管代码,C#是托管代码。

4、什么是托管代码与非托管代码?执行效率对比

不想多说,这篇文章完成能解释托管代码与非托管代码的执行效率对比。在同样的配置环境下,C++效率要比C#效率高出十几倍。十几倍啊,吓死人了。

http://www.cnblogs.com/loverswordsman/articles/1367131.html

好了,不多说了,下面看看如何封装吧

二、vs2015封装c++成dll和lib

    主要参考https://blog.csdn.net/mango_haoming/article/details/79996073

1、建立名称为creatDLL的工程

 该工程存放到我目录C:\Users\lanmage2\Desktop\C++test\test1\

2、往工程添加dll.h文件和对应的dll.cpp

其中,creatDLL.cpp和creatDLL.h文件在我建立工程的时候就有了。保留这两个文件,不作任何修改。

3、往dll.cpp和dll.h添加头文件

注意啊,一般先写dll.h,才写dll.cpp。因为头文件是作了一个概括,这个概括包括了定义的函数,而函数的具体实现,就在dll.cpp中完成。

dll.h:

#ifndef DLL_H
#define DLL_H

extern __declspec(dllexport)int add(int x, int y);
extern __declspec(dllexport)int sub(int x, int y);

#endif

dll.cpp:

#include"stdafx.h"
#include"dll.h"

int add(int x, int y)
{
	return x + y;
}

int sub(int x, int y)
{
	return x - y;
}

4、最后一步,生成解决方案

5、Debug下,生成了两个文件,即creatDLL.dll和creatDLL.lib

这两个文件,是整个工程编译下,生成的文件。以便给C#工程调用或其他工程调用。

注意啊,creatDLL.dll和creatDLL.lib是在整个工程下生成的,因为工程的名字就叫做creatDLL。它们(creatDLL.dll和creatDLL.lib)与文件creatDLL.h、文件creatDLL.cpp,没有半毛钱关系。

三、creatDLL.dll文件、creatDLL.lib文件、dll.h文件,给另一个工程使用

  好了,刚才建立的三个文件creatDLL.dll/creatDLL.lib/dll.h,现在要使用起来。

1、建立一个空的C++控制台工程:

其实这个test2工程,就只有一个main.cpp文件。

2、main.cpp代码

#include<iostream>
#include "dll.h"
//#include "creatDll.h"

using namespace std;

int main(int argc, char** argv)
{
	/*CcreatDll c1;
	cout << ncreatDll << endl;*/

	cout << add(1, 2) << endl
		<< sub(6, 3) << endl;

	getchar();
	return 0;
}

3、输出效果

4、OK,现在来看看配置吧,只有配置成功后,test2工程才能使用

主要参看https://blog.csdn.net/yimiyangguang185/article/details/52585332

4.1、配置头文件存放目录

把test1的dll.h拷贝到test2/include中,test2的include文件是自己建立的。

项目——属性:

编辑进去看看

4.2、配置lib文件

建立lib文件夹,拷贝test1的creatDLL.lib到其中。

工程---属性---配置属性---链接器---常规---附加库目录,其目的是添加lib目录

工程---属性---配置属性---链接器---输入---附加依赖项,其目的是添加lib文件

4.3、配置动态DLL

将creatDLL.dll拷贝到tests的debug下,就可以了

四、总结

1、以上关于.dll/.lib/.h文件的生成,配置已经全部完成。

2、主要lib配置,不但要配置目录,而且还要配置***.lib文件名。

3、大部分的博客只有生成,没有配置。并且大部分配置没有截图,这我最想吐槽的一点。

 

 

 

  • 17
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
首先,你要安装 OpenCV 库和 Visual Studio 2022。如果你已经安装了 OpenCV 库,则可以跳过第一步。 1. 下载并安装 OpenCV 库 - 往 OpenCV 官方网站下载最新版的 OpenCV 库:https://opencv.org/releases/ - 解压下载得到的压缩包,将解压后的文件夹重命名为 "opencv",并将该文件夹移动到 C: 盘根目录下。 2. 创建一个 C++/CLI 项目 - 打开 Visual Studio 2022 并创建一个新的 C++/CLI 项目。 - 在解决方案资源管理器中,右键单击 "源文件",选择 "添加" -> "新项"。 - 在 "添加新项" 对话框中,选择 "C++ 文件 (.cpp)",并将其命名为 "OpenCvWrapper.cpp"。 3. 添加 OpenCV 库文件 - 在解决方案资源管理器中,右键单击项目名称,选择 "属性"。 - 在 "属性页" 中,展开 "VC++ 目录",选择 "包含目录",并添加以下路径:C:\opencv\build\include - 展开 "链接器",选择 "常规",并在 "附加库目录" 中添加以下路径:C:\opencv\build\x64\vc16\lib - 在 "输入" 中,添加以下附加依赖项: opencv_world452.lib opencv_world452d.lib 4. 编写代码 - 打开 "OpenCvWrapper.cpp" 文件,并添加以下代码: ```cpp #include "stdafx.h" #include "OpenCvWrapper.h" using namespace System; using namespace System::Drawing; using namespace System::Drawing::Imaging; // 将 System::Drawing::Bitmap 转换为 cv::Mat cv::Mat BitmapToMat(Bitmap^ bitmap) { // 获取位图数据 Rectangle rect = Rectangle(0, 0, bitmap->Width, bitmap->Height); BitmapData^ bmpData = bitmap->LockBits(rect, ImageLockMode::ReadWrite, bitmap->PixelFormat); // 创建 Mat 对象 cv::Mat mat(bitmap->Height, bitmap->Width, CV_8UC4, bmpData->Scan0); // 释放位图数据 bitmap->UnlockBits(bmpData); return mat; } // 将 cv::Mat 转换为 System::Drawing::Bitmap Bitmap^ MatToBitmap(cv::Mat& mat) { // 创建位图对象 Bitmap^ bitmap = gcnew Bitmap(mat.cols, mat.rows, mat.step, Imaging::PixelFormat::Format32bppArgb, IntPtr(mat.ptr())); return bitmap; } // 使用 OpenCV 对图像进行处理 void ProcessImage(Bitmap^ bitmap) { cv::Mat mat = BitmapToMat(bitmap); // 在这里添加 OpenCV 处理代码,例如: cv::cvtColor(mat, mat, cv::COLOR_BGR2GRAY); cv::GaussianBlur(mat, mat, cv::Size(5, 5), 0); bitmap = MatToBitmap(mat); } // 封装函数,供外部调用 extern "C" __declspec(dllexport) void OpenCvProcessImage(System::IntPtr bitmapHandle) { Bitmap^ bitmap = Bitmap::FromHbitmap(bitmapHandle); ProcessImage(bitmap); // 释放 Bitmap 对象 bitmap->Dispose(); } ``` 5. 创建 Wrapper 类 - 右键单击项目名称,选择 "添加" -> "新项"。 - 在 "添加新项" 对话框中,选择 "C++ 文件 (.cpp)",并将其命名为 "OpenCvWrapper.cpp"。 - 在 "OpenCvWrapper.h" 文件中添加以下代码: ```cpp #pragma once namespace OpenCvWrapper { public ref class OpenCv { public: static void ProcessImage(System::IntPtr bitmapHandle); }; } ``` 6. 编译并生成 DLL - 在解决方案资源管理器中,右键单击项目名称,选择 "属性"。 - 在 "属性页" 中,展开 "常规",选择 "配置类型",并选择 "动态库 (.dll)"。 - 在 "常规" 中,将 "字符集" 设置为 "Unicode"。 - 在 "链接器" 中,展开 "高级",并将 "入口点" 设置为 "OpenCvProcessImage"。 - 点击 "生成" -> "生成解决方案",生成 DLL 文件。 7. 使用 DLL - 将生成DLL 文件复制到你的项目文件夹下。 - 在你的项目中添加对 "OpenCvWrapper.h" 的引用。 - 调用 OpenCv::ProcessImage 方法,传入位图句柄,即可使用 OpenCV 对图像进行处理。 ```cpp // 使用 OpenCvWrapper.dll 对图像进行处理 #include "OpenCvWrapper.h" System::IntPtr hBitmap = bitmap->GetHbitmap(); OpenCvWrapper::OpenCv::ProcessImage(hBitmap); DeleteObject(hBitmap); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值