VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 315|回复: 2

[已解决]萌新遇到问题解决不了啦,关于MFC,求各位大佬帮帮忙

[复制链接]
40_avatar_middle
最佳答案
0 
在线会员 发表于 2021-8-29 00:30:00 | 显示全部楼层 |阅读模式

问题背景:想用mfc和opencv相结合写个小程序。做到保存按钮的时候出了点问题
具体就是想用imwrite将处理后的图片进行保存。结果不加这句话的时候在release下能调通,加了以后就会报错。错误是error LNK2001: 无法解析的外部符号 "class cv::Mat dst"和fatal error LNK1120: 1 个无法解析的外部命令
下面我描述一下我写的这句话:               
  1.         imwrite(szedittext,dst);
复制代码

第一个参数是从编辑框获取到的保存路径,没问题。问题应该在第二个参数上。
由于处理后的图片是在另一个按钮下得到的,所以我就把那个dst定义成了全局变量,想着这样以后就能在这个保存按钮下直接用了
  1. extern         Mat dst;
复制代码
结果就会报那样的错误
下面我就把处理图片的按钮和这个保存按钮的代码贴出来(还有上面这句声明全局变量的),别的也用不上,都贴出来太乱了

  1. <div>void CMFCApplication1Dlg::OnBnClickedButton4()
  2. {
  3.     TCHAR szedittext[MAX_PATH] = {0};
  4.     GetDlgItem(IDC_EDIT1)->GetWindowText(szedittext,MAX_PATH);//得到编辑框中的文件路径

  5.     Mat src = imread(szedittext);
  6.     if (src.empty())
  7.     {
  8.         MessageBox(_T("could not load image...\n"));
  9.     }
  10.     namedWindow("输入窗口", WINDOW_FREERATIO);
  11.     imshow("输入窗口", src);

  12.     Mat dst;
  13.     blur(src,dst,Size(5,5),Point(-1,-1));
  14.     imshow("图像模糊",dst);</div><div>
  15.     waitKey(0);
  16.     destroyAllWindows();
  17. }

  18. //===========================================================================================下面这部分是点了保存按钮之后将模糊后的图片保存至选定的文件路径中
  19. void CMFCApplication1Dlg::OnBnClickedButton3()
  20. {
  21.     // TODO: 在此添加控件通知处理程序代码
  22.     TCHAR szedittext[MAX_PATH] = { 0 };
  23.     GetDlgItem(IDC_EDIT2)->GetWindowText(szedittext, MAX_PATH);//得到编辑框中的文件路径

  24.     imwrite(szedittext,dst);
  25. }</div>
复制代码
求大侠们指点迷津,或者教教我这种按钮之间数据传递的话应该这么写呢,
新手刚入门,大佬们轻点儿骂哈,谢谢啦萌新遇到问题解决不了啦,关于MFC,求各位大佬帮帮忙


最佳答案
31_avatar_small
2021-8-29 01:46:21
本帖最后由 cpp2019 于 2021-8-29 02:17 编辑

要在几个方法中使用可以声明为“成员”变量,当然全局也是可以的,问题是你声明了全局变量为什么又使用局部变量来保存处理结果呢?

先把变量作用域搞清楚,把基础学扎实了,你这一上来就opencv!

你的保存按钮仅仅是保存文件,不需要选择路径,单独搞个按钮显示有点多余。

引起报错的语句:
extern         Mat dst;

这个不叫声明全局变量, 这叫做引用声明,只有在引用外部文件中的全局变量时需要使用extern进行引用声明。

extern的正确用法:
test.h:
  1. #pragma once
  2. int main();
  3. int test();
复制代码

test.cpp:
  1. #include "test.h"

  2. int nRet = 888;
  3. int test()
  4. {
  5.         return nRet;
  6. }
复制代码

main.cpp:
  1. #include <iostream>
  2. #include "test.h"

  3. extern int nRet;
  4. int main()
  5. {
  6.     std::cout << nRet << "\n";
  7. }
复制代码






上一篇:通用对话框
下一篇:编辑框控件过滤回显
31_avatar_middle
最佳答案
49 
在线会员 发表于 2021-8-29 01:46:21 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 cpp2019 于 2021-8-29 02:17 编辑

要在几个方法中使用可以声明为“成员”变量,当然全局也是可以的,问题是你声明了全局变量为什么又使用局部变量来保存处理结果呢?

先把变量作用域搞清楚,把基础学扎实了,你这一上来就opencv!

你的保存按钮仅仅是保存文件,不需要选择路径,单独搞个按钮显示有点多余。

引起报错的语句:
extern         Mat dst;

这个不叫声明全局变量, 这叫做引用声明,只有在引用外部文件中的全局变量时需要使用extern进行引用声明。

extern的正确用法:
test.h:
  1. #pragma once
  2. int main();
  3. int test();
复制代码

test.cpp:
  1. #include "test.h"

  2. int nRet = 888;
  3. int test()
  4. {
  5.         return nRet;
  6. }
复制代码

main.cpp:
  1. #include <iostream>
  2. #include "test.h"

  3. extern int nRet;
  4. int main()
  5. {
  6.     std::cout << nRet << "\n";
  7. }
复制代码


评分

参与人数 2驿站币 +3 热心值 +3 收起 理由
58_avatar_small thzzl + 2 + 2 很给力!
00_avatar_small oyxbl + 1 + 1 赞一个!

查看全部评分

40_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-8-29 17:20:37 | 显示全部楼层
cpp2019 发表于 2021-8-29 01:46
要在几个方法中使用可以声明为“成员”变量,当然全局也是可以的,问题是你声明了全局变量为什么又使用局部 ...

嗯嗯知道啦,基础没打牢就是问题多(我甚至是先学的opencv后来发现看不懂代码又学的C++哈哈),因为老师布置的任务需要,所以学的有点儿乱。昨天晚上是网上别的地方搜的方法试的,有点儿着急就没考虑人家的代码有没有问题。萌新遇到问题解决不了啦,关于MFC,求各位大佬帮帮忙
今天看了你的第一句话我就知道哪儿有问题啦,是对全局变量的理解有问题,去掉那些以后又翻了翻笔记,在两个函数上头定义一个全局变量,两个函数就都能用啦,不用考虑函数之间传递数据的问题。还辛苦你写了那么多,感谢帮助!萌新遇到问题解决不了啦,关于MFC,求各位大佬帮帮忙
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-10-23 16:56

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表