关于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++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...
随机推荐
- Zabbix创建模板(templates)及监控项(item)
Zabbix监控--Zabbix创建模板(templates)及监控项(item) 生产环境中,有一个简单的原则,那就是无监控不上线,监控系统开源方案中,zabbix也算不错的选择.由于其系统接口的开 ...
- Ubuntu 安装 Docker Desktop
介绍 Docker 有两种版本:Docker Desktop 和 Docker Engine (也称作 Docker CE).Docker Desktop 是带图形界面的版本,非常适合需要在桌面环境中 ...
- 【YashanDB知识库】YAS-00103 no free block in dictionary cache
[问题分类]功能使用 [关键字]YAS-00103,no free block in dictionary cache [问题描述]执行union all 太多子查询导致报错,例子如下: [问题原因分 ...
- 总结:redis 突然变慢
用户量暴增,无法下单,凌晨的夜,静悄悄... 经过查找发现Redis. 获取不到连接资源,并且集群中的单台 Redis 连接量很高. 大量的流量没了 Redis 的缓存响应,直接打到了 MySQL,最 ...
- 五分钟入门Webworker
Webworker是基于HTML5提出的一种技术,允许主线程创建Worker线程,将一些任务分配给Worker运行,主线程运行同时,Worker线程在后台运行,互不干扰.等Worker线程完成计算任务 ...
- Locust 进行分布式负载测试
什么是 Locust Locust 是一个开源的负载测试工具,用于测试网站和其他应用程序的性能.它通过编写 Python 脚本来定义虚拟用户的行为,模拟这些用户对目标系统发起请求.Locust 提供了 ...
- Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数
title: Nuxt Kit 自动导入功能:高效管理你的模块和组合式函数 date: 2024/9/14 updated: 2024/9/14 author: cmdragon excerpt: 通 ...
- MyBatis动态增改,多字段模糊查询
示例: insert insert into bargain_products <trim prefix="(" suffix=")" suffixOve ...
- initrd&init进程
initrd的全名是 init ramdisk,是一个启动时存在于内存的文件系统. kernal 到 initrd的流程 在GRUB加载kernel时,kernel会先在内存中制造一个rootfs当做 ...
- 利用3D标签,生成RLE标签编码,并保存到csv文件
# coding:utf-8from glob import globimport osimport SimpleITK as sitkfrom pathlib import Pathimport n ...