Windows C++ 第三方库使用流程备忘录--OpenCV

目录

[三个东西:头文件、lib、dll 分别是什么?](#三个东西:头文件、lib、dll 分别是什么?)

[1. 头文件(.h / .hpp)](#1. 头文件(.h / .hpp))

[2. lib 文件(静态链接信息)](#2. lib 文件(静态链接信息))

[3. dll 文件(运行时真正代码)](#3. dll 文件(运行时真正代码))

[Windows 找 DLL 有规则。](#Windows 找 DLL 有规则。)


写一个 C++ 程序,用 OpenCV 打开摄像头。

实际上做了三件事:

复制代码
你的代码
   ↓
C++编译器
   ↓
生成exe
   ↓
Windows运行

中间涉及三个阶段:

复制代码
1. 编译阶段
2. 链接阶段
3. 运行阶段

三个东西:头文件、lib、dll 分别是什么?

cpp 复制代码
#include <opencv2/opencv.hpp>

cv::Mat img;

程序需要 OpenCV,但是编译器不知道:

cv::Mat 到底是什么?

所以需要:

1. 头文件(.h / .hpp)

作用:

告诉编译器"这个东西存在"

比如:

复制代码
opencv.hpp

里面告诉编译器:

cpp 复制代码
class Mat
{
    ...
};

class VideoCapture
{
    ...
};

相当于:说明书

cpp 复制代码
#include <opencv2/opencv.hpp>

就是读说明书。


2. lib 文件(静态链接信息)

例如:

cpp 复制代码
opencv_world4110.lib

作用:

告诉链接器,函数在哪里

比如你写:

复制代码
cv::imshow();

编译器知道:"哦,有这个函数",链接器问:"这个函数代码在哪?"

lib告诉它:

cpp 复制代码
imshow()
在opencv_world4110里面

然后生成:

复制代码
pROJCT.exe

3. dll 文件(运行时真正代码)

例如:这个才是程序运行时需要的。

复制代码
pROJCT.exe

opencv_world4110.dll 里面没有 OpenCV 的全部代码,它只是记录:

cpp 复制代码
我要调用opencv_world4110.dll里的函数

运行时:

Windows:

复制代码
启动 pROJCT.exe

↓

寻找 opencv_world4110.dll

↓

找到

↓

加载

↓

运行

如果找不到:

复制代码
0xC0000135

就是:DLL不存在,程序无法启动。

Windows 找 DLL 有规则。

它会在:

复制代码
1. exe所在目录
2. 系统目录
3. PATH环境变量目录

寻找。以前:

复制代码
D:\pROJCT\cmake-build-debug

    pROJCT.exe

但是:opencv_world4110.dll

在:

复制代码
D:\OpenCV\opencv\build\x64\vc17\bin

Windows:

cpp 复制代码
启动exe

寻找DLL

D:\pROJCT\cmake-build-debug
没有

系统目录
没有

PATH
没有

失败
相关推荐
denlaku3 分钟前
JDK 13 新特性详解
java·开发语言
念越16 分钟前
题库、练习与错题本代码阅读
开发语言·数据结构
l1t18 分钟前
几种数据库软件count(distinct)和count()from group by子查询性能测试
开发语言·数据库
熊猫钓鱼>_>26 分钟前
大学图论第 6 讲:网络流与二分图匹配——对偶性让瓶颈自己现形
开发语言·算法·面试·职场和发展·图论·校招·面经
方便面不加香菜27 分钟前
C++ 关于多态的知识点讲解
开发语言·c++
jimy11 小时前
C++ 类成员函数的内联定义(inline)详解
开发语言·c++
Nebula_g1 小时前
JavaSE高级:动态代理
java·开发语言·算法·javase
sanqima1 小时前
CreateThread、_beginthreadex、AfxBeginThread三种线程创建的区别与联系
c++·tls·线程创建
青春逝如流水1 小时前
Java 线程与操作系统、硬件的关系:状态、映射与差异
java·开发语言·多线程·ai文章
sanqima1 小时前
依赖TLS和模块状态的MFC类
c++·mfc·tls·module state