基本概念
C++ 中有两种类型的库:静态库、动态库
静态库
静态库是成为引用它的可执行文件的一部分的库。因此,当我们开发应用程序并引用其中的静态库时,静态库的内容在应用程序中被替换。
Windows 上的静态库通常具有扩展名“.lib”,而 Linux 上的静态库扩展名为“.a”。
拥有程序引用静态库的一个优点是我们不必将静态库与可执行文件一起分发。这是因为静态库的内容是应用程序的一部分,不需要单独给出。
这个特定的优点导致了一个缺点,因为可执行文件可能会变得庞大,并且由于库是可执行文件的一部分而浪费了太多空间。
静态库的另一个缺点是,如果静态库发生变化,那么引用它的可执行文件也需要更新。
动态库
动态库也称为“共享库”。在 Windows 中,动态库的扩展名为“.dll”(动态链接库)。在 Linux 上,动态库的扩展名为“.so”(共享对象)。
动态库是由在运行时加载到应用程序中的例程组成的库。当应用程序引用动态库时,该库不会成为应用程序的一部分,而是作为一个单独的单元保留。
动态库的优点是库的一个副本可以被许多应用程序共享,从而节省空间。还有一个优点是,由于动态库是一个单独的单元,当动态库改变时,应用程序可执行文件不会改变。
动态库的唯一缺点是它需要一个单独的程序来加载和引用库,非常麻烦。
下面以 python 作为对比,来说明 c++;
c++ 编程同样需要用到 一些 包/库,如 opencv;
在 vs 中,很少使用源文件,大部分是使用 对类进行声明的头文件 和 封装了类的 链接库(静态库lib 动态库dll); 【源文件 类似 python 源代码;头文件类似 pip安装的包;链接库 类似 包 所 依赖的文件】
如果要使用这些类,须在编程文件中 声明 头文件的名字,如 #include “cv/opencv.h” 【声明头文件 类似 python 中 import 包;cv/opencv.h 指明了 包的地址,这个地址前面没写全的路径dir 需要在 类似环境变量 的地方 指定,dir 就是所搜路径】
头文件是 .h 文件;
安装库
库可能是预编译的,在这种情况下,只需要下载对应操作系统的库。如果库没有预编译,那么需要下载源代码并进行编译。
在 Windows 上,C++库通常具有.zip扩展名,而在 Linux 操作系统上,库包以“.RPM”的形式分发。
在 Linux 上,可以调用包管理器来安装库。
在 Windows 上一般是下载后直接解压,然后 配置环境 即可; 设置库的路径,以便编译器知道在哪里查找库文件
解压文件格式基本固定,如下图,其中 include 内是头文件,在 vs 配置环境时 指定该路径, include 文件夹内 可能还有 include 文件加,如果用到里面的 .h文件,也许指定 子 include 路径;
lib 内是 链接库,包括 .lib 文件 和 .dll 文件,这两种文件的路径也需指定,写代码时才能找到;
.lib路径要在 vs中进行设置,.dll一般要添加到环境变量中;
以安装 libtorch 库为例
什么是 libtorch
libtorch是pytorch的C++版本,支持CPU端和GPU端的部署和训练。
由于python和c++的语言特性,因此用pytorch做模型训练,libtorch做模型部署。
用libtorch部署pytorch模型,而不是用tensorrt等工具部署模型的优势在于:pytorch和libtorch同属一个生态,API语句比较接近,并且不会出现某网络层不支持的问题
安装步骤简写 【详细见参考资料,本文只记录了 安装过程中的 问题,标绿色 的】
(一)下载 libtorch,https://pytorch.org/get-started/locally/
(二)设置 环境变量
path 里 添加 .dll 文件的搜索路径
(三)VS 配置
1.设置配置管理器
生成 菜单里,也可如下图
下载的 debug 版本 就设为 debug,64位
2.设置头文件路径
注意 这里 debug 和 上一步保持一致;
libtorch 需要这两个头文件,第一个 在 include 下, 第二个在 include\torch\csrc\api\include 下
#include "torch/script.h" #include "torch/torch.h"
3.设置链接库
添加 lib 路径
添加 lib 路径 下的所有 .lib 文件 不一定是所有,如果不知道该添哪个,就所有吧,也可以这样写 D:\soft\libtorch\libtorch\lib\*.lib
.lib 为静态库,有时候还需要设置 .dll 动态库,以 opencv 为例
动态链接库需要放入指定位置,有三种做法:
将opencv中的\build\x64\vc14\bin文件夹路径放入环境变量path中;
拷贝opencv中的dll文件到项目的执行目录中;
将opencv中的dll路径配置到VS项目中;
从省事角度和工程需要角度,一般都是直接拷贝dll到执行目录中。读者可以在项目编译后执行时报错缺啥拷贝啥。
4.测试安装成功
#include "torch/torch.h" #include "torch/script.h" int main() { torch::Tensor output = torch::randn({ 3,2 }); std::cout << output; return 0; }
5. gpu 测试
如果 装的是 gpu 版,可以先测试下 gpu 版是否安装成功,测试代码如下
#include<torch/torch.h> #include<torch/script.h> #include<iostream> int main() { std::cout << "cuda::is_available():" << torch::cuda::is_available() << std::endl; std::cout << "torch::cuda::cudnn_is_available():" << torch::cuda::cudnn_is_available() << std::endl; std::cout << "torch::cuda::device_count():" << torch::cuda::device_count() << std::endl; torch::Device device(torch::kCUDA); torch::Tensor tensor1 = torch::eye(3); // (A) tensor-cpu torch::Tensor tensor2 = torch::eye(3, device); // (B) tensor-cuda std::cout << tensor1 << std::endl; std::cout << tensor2 << std::endl; }
没找到 libtorch 和 cuda 的对应版本,刚开始 gpu 不能用,解决方案如下:
/INCLUDE:?warp_size@cuda@at@@YAHXZ
gpu 是可以用了,但是 c++ 加载 深度学习模型 还是 没调通 gpu 版
其他库安装 大同小异,不过建议安装时 搜一下教程 ,特别是比较大的库 。
参考资料 :
https://blog.csdn.net/weixin_44510615/article/details/119898572 如何安装和使用 C++ 标准库
https://blog.csdn.net/qq_39383591/article/details/118878542 visual studio 配置头文件路径
https://www.jianshu.com/p/b0b6ab5002cd LibTorch安装&配置&使用
https://blog.csdn.net/weixin_43917589/article/details/124509964 Libtorch的介绍与使用方法
https://blog.csdn.net/weixin_45632168/article/details/114679263 LibTorch的安装、配置与使用
https://www.bilibili.com/video/BV14v411b733?spm_id_from=333.337.search-card.all.click&vd_source=f0fc90583fffcc40abb645ed9d20da32 win10系统上LibTorch的安装和使用(cuda10.1版本)
https://blog.51cto.com/u_15088375/3248544 win10系统上LibTorch的安装和使用(cuda10.1版本)
https://www.jb51.net/article/247482.htm VS2022+libtorch+Cuda11.3安装测试教程详解(调用cuda)
https://blog.csdn.net/m0_61897853/article/details/122609454 OpenCV安装及其开发环境配置(C++)