关于MNN工程框架编译出来的静态库和动态库的使用
一、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工程框架编译出来的静态库和动态库的使用的更多相关文章
- 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改
来源连接 http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...
- android开发 NDK 编译和使用静态库、动态库 (转)
在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...
- Linux上静态库和动态库的编译和使用
linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只 ...
- linux上静态库和动态库的编译和使用(附外部符号错误浅谈)
主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考 ...
- Linux下编译、使用静态库和动态库 自己测过的
每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...
- gcc编译静态库和动态库
今天要用到静态库和动态库,于是写了几个例子来巩固一下基础.hello1.c ———————————————————— #include <stdio.h>void print1(int ...
- 【转】Linux编译链接问题----静态库和动态库
Linux静态库和动态库的命名规则 静态函数库 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中. a) 优点: 编译后,可执行文件不 ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- (转)C++静态库与动态库
转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...
随机推荐
- SPI协议,MCP2515裸机驱动详解
SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应用在 EEPROM,FLASH, ...
- [粉丝问答16]应届生被放鸽子,怒怼HR!找工作和找对象哪个更残酷?
很多应届生在求职过程中遇到过被放鸽子的情况,但是由于段位不高,资源不够,社会阅历尚浅,很多人都是忍气吐声,但是也不乏有些学生性格刚硬,怒怼的. 比如下面这位学生,竟然直接怼了HR. 0.应届硕士小伙怒 ...
- 初三奥赛模拟测试1--T1回文
初三奥赛模拟测试1--\(T1\)回文 HZOI 题意 给定一个 \(n \times m\) 的,由字符组成的矩阵 \(A\) , 问你由 \(( 1 , 1 )\) 开始,点 \(( i , j ...
- 《HelloGitHub》第 101 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...
- C++ | 每一个C++程序员都应该知道的RAII
导读:RAII是C++中一种管理资源.避免资源泄漏的惯用法,利用栈的特点来实现.本文较为详细介绍了RAII的原理.使用方法和优点,并且通过实例讲解了RAII在C++ STL中的应用,如智能指针和互斥锁 ...
- 如何在 Nuxt 3 中有效使用 TypeScript
title: 如何在 Nuxt 3 中有效使用 TypeScript date: 2024/9/9 updated: 2024/9/9 author: cmdragon excerpt: 摘要:本文详 ...
- python学习教材选哪个
python语言俨然成为当今最流行的国际语言,无论你是做AI的还是非AI,大家都在用python语言,各种平台也都开始支持python,现在连文科生都在学习python语言了,甚至很多表哥表姐的工作都 ...
- 处理英文中的单数复数 (pluralize, singular plural)
因为英语很烂, 有时候很烦这个. 如果是 hard code 的情况, 如果我不清楚的话就会去这里找 https://www.wordhippo.com/what-is/the-plural-of/l ...
- 29. GIL全局解释器锁、信号量、线程池进程池
1. GIL全局解释器锁 1.1 概念 '''In CPython, the global interpreter lock, or GIL, is a mutex that prevents mul ...
- Java日期时间API系列41-----根据毫秒值计算倒计时
会有一个比较常见的需求,计算倒计时,比如,计算距离某时间剩余时间(27小时10分钟30秒.1天3小时10分钟30秒)或者已经进行了多长时间等.下面是2种实现代码:其中第一种超过1天会体现在小时上,比如 ...