一、MNN.lib文件路径

如果你看过之前的博客内容,应该可以在编译的的工程当中

C:\Users\Administrator\Desktop\MNN\MNN-master\MNN-CPU-OPENCL\lib\x64\lib\x64

该路径下面找到debug和release两个文件夹。

进入到release文件夹下面有Dynamic和Static两个文件夹,分别代表编译出来的静态库和动态库内容。这里先讲述静态库的使用。

进入Static文件夹,下面有MD和MT两个子文件夹,分别的含义:

MD、MT的含义和区别

  • MT (Multi-Threaded)

    静态运行时库:MT 表示多线程静态运行时库。这种配置会将 C++ 运行时库(如 libcmt.lib)静态链接到你的可执行文件中。这意味着所有的运行时库代码都被包含在生成的可执行文件或静态库(.lib 文件)中,生成的文件会比较大,但在不同的应用程序或库之间不会共享运行时库。这个方式不依赖于外部的 DLL 文件。

  • MD (Multi-Threaded DLL)

    动态运行时库:MD 表示多线程动态运行时库(DLL)。这种配置会将 C++ 运行时库的动态链接库(如 msvcrt.lib)链接到你的程序中。生成的可执行文件会依赖外部的运行时库 DLL 文件,如 MSVCR120.dll。相较于静态链接,动态链接的优势是多个应用程序可以共享同一个 DLL 文件,因此减少了总的内存占用,但这也意味着你必须确保系统中存在正确的运行时库版本。

二、静态库的使用

这里选择MD!!!!(为什么MT当中的lib文件无法使用,我自己也不太清楚,如果有前辈了解的话可以告诉我)

,将其中编译得到的.lib文件复制出来,移动到新的工程目录下面.最终工程目录如下:

点击查看代码
D:.
├─ConsoleApplication1
│ ├─ConsoleA.e1228ae8
│ │ └─x64
│ │ └─Debug
│ │ └─ConsoleA.e1228ae8.tlog
│ └─x64
│ └─Debug
├─include
│ ├─cv
│ │ └─imgproc
│ ├─MNN
│ │ ├─expr
│ │ └─plugin
│ └─stb
│ ├─.github
│ │ ├─ISSUE_TEMPLATE
│ │ └─workflows
│ ├─data
│ │ └─herringbone
│ ├─deprecated
│ ├─docs
│ ├─stb_image_resize_test
│ ├─tests
│ │ ├─caveview
│ │ │ └─win32
│ │ ├─oversample
│ │ ├─pbm
│ │ ├─pg_test
│ │ ├─pngsuite
│ │ │ ├─16bit
│ │ │ ├─corrupt
│ │ │ ├─iphone
│ │ │ ├─primary
│ │ │ ├─primary_check
│ │ │ └─unused
│ │ ├─prerelease
│ │ ├─sdf
│ │ └─vorbseek
│ └─tools
│ └─unicode
└─lib

这里可以看到我将需要的头文件包含到了include文件夹下面,将静态库包含到了lib文件夹下面,此时打开visual studio工程当中的powershell文件夹,执行指令

cl /I"D:\System-default\DeskTop\ConsoleApplication1\include" ConsoleApplication1.cpp /link /LIBPATH:"D:\System-default\DeskTop\ConsoleApplication1\lib" MNN.lib

这里使用的是静态库 MNN.lib,所有必要的代码在编译时都被嵌入到最终的可执行文件中。

命令解释

cl 是 Visual Studio 的 C/C++ 编译器。
/I"D:\System-default\DeskTop\ConsoleApplication1\include" 指定了包含路径,也就是你的头文件所在的目录。
ConsoleApplication1.cpp 是你的源文件。
/link 指定链接选项,后面跟随 /LIBPATH:"D:\System-default\DeskTop\ConsoleApplication1\lib",指定库文件的路径。
MNN.lib 是你要链接的静态库文件。

注意!!!!

这里的编译工具链需要指定使用visual studio的工具链,而不能使用MinGW的工具链,因为lib文件是使用visual studio工具编译出来的

Visual Studio 生成的 .lib 文件是 COFF 格式(Common Object File Format),专门用于 Windows 平台,并且它们的链接方式依赖于 Microsoft 的链接器。
MinGW 使用的 .a 文件(或 .lib 文件,如果是静态库)则是基于 GNU 工具链,格式和 Visual Studio 不同,不能直接互换使用。

这样就可以不需要MNN框架而通过利用MNN编译的静态库。

不过上面是通过powershell来执行编译的指令,较为麻烦。关于直接使用visual studio来编译的具体步骤我之前有尝试过,但是出了问题,所以有待后续补充。

三、动态库的使用

参考博客:创建和调用DLL动态链接库(傻瓜式教程)

关于visual studio的配置可以参考上面的链接,我这里仍然使用的是powershell指令:

cl /I"D:\System-default\DeskTop\ConsoleApplication1\include" ConsoleApplication1.cpp /link /LIBPATH:"D:\System-default\DeskTop\ConsoleApplication_Dynamic\dll" MNN.lib

这里虽然仍然使用了 MNN.lib,但这个 .lib 文件实际上是一个导入库,它只是包含了用于运行时链接 MNN.dll 的信息,而不包含函数的实际实现。实际的代码在 MNN.dll 中,运行时需要在系统路径或指定路径下找到这个 MNN.dll。

关于MNN工程框架编译出来的静态库和动态库的使用的更多相关文章

  1. 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改

    来源连接   http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...

  2. android开发 NDK 编译和使用静态库、动态库 (转)

    在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...

  3. Linux上静态库和动态库的编译和使用

    linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...

  4. linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

    主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考 ...

  5. Linux下编译、使用静态库和动态库 自己测过的

    每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...

  6. gcc编译静态库和动态库

      今天要用到静态库和动态库,于是写了几个例子来巩固一下基础.hello1.c ———————————————————— #include <stdio.h>void print1(int ...

  7. 【转】Linux编译链接问题----静态库和动态库

    Linux静态库和动态库的命名规则 静态函数库 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中. a) 优点: 编译后,可执行文件不 ...

  8. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

  9. C++静态库与动态库

    C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...

  10. (转)C++静态库与动态库

    转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...

随机推荐

  1. 3. 从0开始学ARM-ARM模式、寄存器、流水线

    关于ARM的一些基本概念,大家可以参考我之前的文章: <到底什么是Cortex.ARMv8.arm架构.ARM指令集.soc?一文帮你梳理基础概念[科普]> 关于ARM指令用到的IDE开发 ...

  2. Element ui 动态自定义表格单元格样式

    最终实现效果 在Element UI 的文档中提到了用cell-style 方法来自定义单元格样式: 具体使用方法: 1. 在el-table 标签中添加 cell-style 绑定的自定义方法 2. ...

  3. 微信小程序 BLE 基础业务接口封装

    写在前面:本文所述未必符合当前最新情形(包括蓝牙技术发展.微信小程序接口迭代等). 微信小程序为蓝牙操作提供了很多接口,但在实际开发过程中,会发现隐藏了不少坑.目前主流蓝牙应用都是基于低功耗蓝牙(BL ...

  4. animate动画库的使用

    在vue中便捷使用animate动画库效果. 安装animate动画库 npm install animate.css --save 在vue跟目录中 main.js 导入animate动画库 imp ...

  5. 在虚拟机CentOS中安装jdk

    公众号本文地址:在虚拟机CentOS中安装jdk 本文主要是记录在CentOS中安装新的JDK的过程. 在虚拟机的centos中安装Jdk主要分为三步,第一步上传jdk文件到centos中,第二步解压 ...

  6. python项目生成exe

    前言 做了个python的小项目,需要打包为桌面端的exe使用,结果一打包,体积直接上百兆了,研究了下,使用虚拟环境打出的包会更干净小巧. 安装anaconda anaconda用作python的虚拟 ...

  7. 消息队列的对比测试与RocketMQ使用扩展

    消息队列的对比测试与RocketMQ使用扩展     本文的主要内容包括以下几个方面: 原有的消息技术选型 RocketMQ与kafka 测试对比 如何构建自己的消息队列服务 RocketMQ扩展改造 ...

  8. TextIn文档树引擎,助力RAG知识库问答检索召回能力提升

    ​ TextIn团队的文档解析测评工具Markdown Tester在Github发布后,我们陆续与大家探讨了目前业内对PDF解析工作的评判标准与我们各项测评指标的设计原理,包括段落.表格.公式.阅读 ...

  9. BOM – 操作 Query

    前言 ASP.NET Core 写过一篇关于操作 query 的 ASP.NET Core – 操作 Uri 和 Query. 前端偶尔也会需要做出 query. URLSearchParams 之前 ...

  10. Nuxt Kit API :路径解析工具

    title: Nuxt Kit API :路径解析工具 date: 2024/9/22 updated: 2024/9/22 author: cmdragon excerpt: 摘要:本文介绍了Nux ...