文章目录
- 1 前言
- 2 过程
- 3 问题集合
- Q1 opencv是x64
- Q2 error LNK2019: 无法解析的外部符号
- Q3 相对路径问题
- Q4 设置VS2019 支持C++17标准
- Q5 由于找不到opencv_world440d.dll,无法执行代码
- Q6 错误LNK1104无法打开文件“kernel32.lib”等
- Q7 "error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead" 解决方法
- 08 vs2019永久配置opencv开发环境
- Q9 无可用信息,未为 opencv_world454.dll 加载任何符号
- Q10 C/C++ 中 main 函数参数 argc,argv 说明以及 VS 调试配置
- 4 参考文章
- 5 学习资料
- 6 编译结果
1 前言
先说结果:
调通了VS2019的C++编译版本。
CMake版本,后续补上。
2 过程
2.1 方案一 Ubuntu
- 编译环境CMake
- 工具 Virtual Box + Ubuntu 18.04 + VSCode
- 结果:失败
- 原因,感觉是库的地址没有配对,暂时不去折腾了
作业三 渲染管线和着色器
作业五 光线追踪
直接99%卡住不动
2.2 方案二 Win 10 + CMake
windows 下面的CMake编译
问题在于opencv都编译通不过。
原因分析:
- 网速慢,依赖的库下载不下来,后续可以考虑下载网上直接编译好的代码
- 库的环境位置不对
2.3 方案三 Win 10 + VS2019
以GAMES101为例。
外部库依赖为Eigen和OpenCV两个库,把这两个库配置好,其他问题可以见本篇的问题集合以及网络搜素可以查找到答案。
VS2019还有一个比较好的优势是调试相对方便。
2.3.1 Eigen库配置
- Eigen库。下载地址,我的版本是3.4.0
库简介
Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法
Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.
![](https://i-blog.csdnimg.cn/blog_migrate/ae1842f50e353859a9cc1eac5173a5d9.png)
操作步骤:下载解压到指定目录。
(1)VS2019配置,引入到工程文件的VC++ 目录 -> 包含目录
2.3.2 OpenCV配置
- OpenCV库。下载地址,我的版本是4.5.4
库简介
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV文件组成
VS中使用OpenCV调用的是
①bin文件:opencv_ffmpeg341.dll,视频编解码软件
②include文件:包含.h等头文件 x64文件=bin文件(opencv_world341d.dll)+ lib文件(opencv_world341.lib),其中vc14对应VS2015,vc15对应VS2017
操作步骤:下载解压到指定目录
(1)系统环境变量中引入。D:\ProgramFiles\opencv\build\x64\vc15\bin。
vc10表示VS是2010,vc11对应VS2012,vc12对应VS2013,vc14对应VS2015 ,vc15对应VS2017
(1)配置Path系统环境变量:此电脑–>右键“属性”–>高级系统设置–>环境变量–>系统变量中的path,在变量值里面添加相应的路径; D:\ProgramFiles\opencv\build\x64\vc15\bin
(配置动态链接库,注意自己的路径)
(2)VS2017中配置OpenCV
菜单栏中点击视图->属性管理器
,即打开属性管理器工作区;
工程中右击–>属性
包含目录
配置:VC++目录—>包含目录
:
D:\ProgramFiles\opencv\build\include
D:\ProgramFiles\opencv\build\include\opencv2
库目录
配置:VC++目录
—>库目录
:D:\ProgramFiles\opencv\build\x64\vc15\lib
(参考文章是用的bin,但我报错了)
x64表示电脑是64位,32位选择x86
vc10表示VS是2010,vc11对应VS2012,vc12对应VS2013,vc14对应VS2015 ,vc15对应VS2017
链接器
配置:链接器–>输入–>附加依赖项
debug:
opencv_world454d.lib
release:opencv_world454.lib
若执行时出现找不opencv_world454d.dll
,就把自己opencv文件目录下的D:\ProgramFiles\opencv\build\x64\vc15\bin
中的三个dll文件,拷贝到C:\window\System32
和C:\window\SysWOW64
中
3 问题集合
Q1 opencv是x64
解决方案平台x64,不能是x86,不然会报模块计算机类型“X64”与目标计算机类型“X86”冲突的问题。因为opencv是x64的,所以模块(包)都是x64的
Q2 error LNK2019: 无法解析的外部符号
原因:链接器中填写的输入的外部依赖包,并没有找到,填入对应的lib库即可。(注意这里有opencv_world454d.lib和opencv_world454d.lib,两个版本,选择能通过编译的版本,不要都加上)。其实在配置的部分已经说明了,这里是记录编译报错,解决错误的方法。
Q3 相对路径问题
c++要使用外部的图片等资源文件,这就涉及到路径问题
Visual Studio 中使用cv::imread读取图片时的一个易错点
1、例如在VS2019中使用cv::imread(path)读取path的图片时,
注意两点:(1)相对路径相对.vcxproj来写;(2)若在debug模式下,则包含的附加依赖项中 不带d的lib 都要去除!
Q4 设置VS2019 支持C++17标准
没有配置的话,当你使用C++17的最新接口和方法时,会报错
Q5 由于找不到opencv_world440d.dll,无法执行代码
将 opencv 安装路径 目录\opencv\build\x64\vc15\bin 中所有后缀是.dll 的应用程序扩展复制到 C:\Windows\System32 中
这个地方需要注意,必须把目录下的所有.dll文件拷贝过去。好多博客仅说拷贝缺失的.dll文件,或是拷贝opencv_world440d.dll和opencv_world440.dll两个文件
Q6 错误LNK1104无法打开文件“kernel32.lib”等
我是直接添加对应的目录解决问题的。
步骤:在vs2019界面内依次点击【项目】 【属性】 【VC++目录】 【库目录】【 编辑】 进去后加上这一行C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\um\x86
安装库:
第一步:打开visual studio installer,找到你安装的哪个版本。
第二部:点击“修改”按钮,等待文件安装列表,选择“单个组件”。
第三步:滚动条拉到最下面,选择“Windows 10 SDK(10.014393.0)”,然后点击右下角的“修改”按钮,等待安装成功即可。
最后:安装完库文件后,如果还不能解决问题,可以尝试在vs2017界面内依次点击【项目】 【属性】 【VC++目录】 【库目录】【 编辑】 进去后加上这一行C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\um\x86
Q7 “error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead” 解决方法
解决办法:
项目----》 XX属性 ----》C++ —>预处理器 —》在预处理器定义添加“_CRT_SECURE_NO_WARNINGS”
08 vs2019永久配置opencv开发环境
vs2019永久配置opencv开发环境
可以参考文章,本质其实就是将库拷贝到基础库中
Q9 无可用信息,未为 opencv_world454.dll 加载任何符号
我的问题出在图片输出这个地方cv::imwrite(filename, image);
:
if (command_line)
{
r.clear(rst::Buffers::Color | rst::Buffers::Depth);
r.set_model(get_model_matrix(angle));
r.set_view(get_view_matrix(eye_pos));
r.set_projection(get_projection_matrix(45.0, 1, 0.1, 50));
r.draw(TriangleList);
cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data());
image.convertTo(image, CV_8UC3, 1.0f);
cv::cvtColor(image, image, cv::COLOR_RGB2BGR);
cv::imwrite(filename, image);
return 0;
}
解决办法:命令行参数问题
int main(int argc, const char** argv)
方法中,argc指传入参数的个数,argv存储了所有的命令行参数。
在调试过程中,属性->调试->命令行参数。要注意的时默认第一个为exe的参数
例如下图:默认argv[0] 为exe,arcgv[1]为normal.png,arcgv[2]为normal
Q10 C/C++ 中 main 函数参数 argc,argv 说明以及 VS 调试配置
直接看这篇文章
两种方式:
方法1 命令行中运行
方法2 VS调试运行
4 参考文章
MFC+OpenCV使用问题及解决办法,可以参考
error LNK2019: 无法解析的外部符号”的几种可能原因
无法解析的外部符号 void __cdecl cv::imshow
Visual Studio 中使用cv::imread读取图片时的一个易错点
VS2019配置OpenCV运行时报错:找不到opencv_worldxxx.dll
错误LNK1104无法打开文件“kernel32.lib”等
OpenCV error LNK1104: cannot open file ‘opencv_core231.lib’
vs2019永久配置opencv开发环境
5 学习资料
https://blog.csdn.net/qq_40515692/article/details/81042303