目录
[三个东西:头文件、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
没有
失败