一、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. mongodb 中嵌套数组的且查询

    如果在mongodb中存在如下数据 { audit:{ experts:[{expertId:"1",result:"success",......} {exp ...

  2. 2022年第一天,体验了一把wan(皖)式服务

    在新的一年到来之际, 一口君首先祝各位粉丝朋友新年快乐! 心想事成! 事业顺利! 阖家欢乐! 财源广进! 2022年的第一天,一口君带着家人去了躺马鞍山,享受了一下马鞍山的洗浴. 马鞍山桑拿虽然比不上 ...

  3. Ubuntu搭建ssh服务器

    Ubuntu安装后默认只有ssh客户端,即只能在Ubuntu内去连接其他ssh服务器,若想实现我们的Ubuntu被其他主机远程连接,则需要自己去安装ssh服务端. 安装 进入Ubuntu18.04,打 ...

  4. Go 互斥锁 Mutex 源码分析 (一)

    0. 前言 锁作为并发编程中的关键一环,是应该要深入掌握的. 1. 锁 1.1 示例 实现锁很简单,示例如下: var global int func main() { var mu sync.Mut ...

  5. 虚拟文件系统VFS-片段一

    文件系统类型 基于磁盘的文件系统 如FAT.EXT4 虚拟文件系统 如proc 网络文件系统 顾名思义,网络文件系统还将网络通信封装起来,这意味可以直接通过通信访问另一台设备的文件系统. man fs ...

  6. 题解:SP22382 ETFD - Euler Totient Function Depth

    题目链接: link,点击这里喵. 前置知识: [模板]线性筛素数,欧拉函数,点击这里喵. 题意简述: 给定整数 $l,r,k$,求出 $[l,r]$ 中有多少个整数不断对自己取欧拉函数刚好 $k$ ...

  7. draw.io 输入数学公式

    首先我们要把数学排版功能打开: 然后输入数学公式: AsciiMath 公式由 ` 包裹,如:`a2+b2 = c^2` LaTeX 公式由 $$ 包裹,如:$$\sqrt{3×-1}+(1+x)^2 ...

  8. 使用 nuxi prepare 命令准备 Nuxt 项目

    title: 使用 nuxi prepare 命令准备 Nuxt 项目 date: 2024/9/7 updated: 2024/9/7 author: cmdragon excerpt: 摘要:本文 ...

  9. Cloudflare D1 - 免费数据存储

    前言 自从上次将博客项目的图片从 七牛云 迁到了 Cloudflare R2 之后就发现,Cloudflare 这个赛博菩萨的产品是真的不错,非常的适合白嫖,DevNow 项目作为一个开源博客,整体来 ...

  10. CSS – Dimension min-content, max-content, fit-content

    前言 无意间在 practice 的时候看到视频使用, 以前没有听过. 它有点像 Figma 的 hug content, 据说 CSS 2.1 也是有类似的概念, 只是没有被正式纳入 CSS 里. ...