vs2010使用main函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs2010使用main函数相关的知识,希望对你有一定的参考价值。
听说vs的项目都只能有一个main函数,如果把各个功能函数分别写到不同的文件里,在其中一个文件中定义主函数,然后当需要其他功能函数时在主函数文件的开头引用功能函数的文件,比如include<xxx.cpp>这样可以吗,引用以后就可以直接使用功能函数了吗?
比如xxx.cpp里面有一个函数int abc(int a,int b)...
主函数main中:abc(x,y);
这样使用吗?
变量、函数都可以多次声明,但都只能定义一次。main.cpp里只需要声明函数即可:
即在前面加一句int abc(int a, int b);(注意不要用花括号对来定义函数体,只要这样声明就可以了)
这样就可以在main里用abc函数了。一般做法是把那一句声明写在xxx.h里,然后主函数里#include "xxx.h"。
注意:自己写的文件,非标准库文件,必须#include "xxx.h“这样,不能#include <xxx.h>,即要用双引号,不能用尖括号对。追问
如果在xxx.h里面声明若干个函数,然后在main函数文件头引用#include "xxx.h",那功能函数要在哪里定义呢?是另写一个文件还是在xxx.h里定义?
追答标准做法是:函数定义写在.cpp里,对应的声明写在对应的.h里。
函数定义不写在.h里是因为.h一般会被多次include,这样会造成重定义。
使用函数前要看到这个函数的声明或定义,整个工程里有且仅有一次定义(可以有任意次声明)。
如果建立的是Win32控制台的话,直接可以看到main(),如果建立的是Win32程序的话,有一个WinMain()是入口函数。
如果建立的MFC的话,它被MFC框架隐藏了,还是别找了,即便没有main(),MFC的运行结构也是很明晰的,基本上从构造CWinApp开始,自己的初始化代码写在InitInstance里。 参考技术B main函数是程序运行的入口。
绝大多数的程序都需要提供这样一个运行入口。有的时候这个入口的名字会有变更,但是用途是一致的。
这个函数是有系统进行调用的,一般不允许在程序中自己进行调用。
可以在VS2010中创建工程,选择“控制台应用程序”。程序会提供一个默认的main函数。直接在其中进行程序编写即可。 参考技术C 把.cpp换成.h试试,可以把函数的创建写到头文件里面,然后再main函数所有的cpp文件include该头文件 参考技术D 一般不这样用,一般要在头文件中定义外部函数extern,具体找一下资料
近期VS2015使用问题总结
问题一
MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
*****.exe : fatal error LNK1120: 1 个无法解析的外部命令
解决办法:
项目->属性->配置属性->连接器->系统中的【子系统】设置为Windows(/SUBSYSTEM:CONSOLE)
问题二
ImgProc.obj : error LNK2019: 无法解析的外部符号 "class cv::debug_build_guard::_InputOutputArray const & __cdecl cv::noArray(void)" (?noArray@cv@@YAAEBV_InputOutputArray@debug_build_guard@1@XZ),该符号在函数 "private: double __cdecl ImgProc::TemplateMatchingOnGray(int)" (?TemplateMatchingOnGray@ImgProc@@AEAANH@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "public: void __cdecl cv::Mat::copyTo(class cv::debug_build_guard::_OutputArray const &)const " (?copyTo@Mat@cv@@QEBAXAEBV_OutputArray@debug_build_guard@2@@Z),该符号在函数 "public: __cdecl cv::Mat::Mat<double,2,3>(class cv::Matx<double,2,3> const &,bool)" (??$?0N$01$02@Mat@cv@@QEAA@AEBV?$Matx@N$01$02@1@_N@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::minMaxLoc(class cv::debug_build_guard::_InputArray const &,double *,double *,class cv::Point_<int> *,class cv::Point_<int> *,class cv::debug_build_guard::_InputArray const &)" (?minMaxLoc@cv@@YAXAEBV_InputArray@debug_build_guard@1@PEAN1PEAV?$Point_@H@1@20@Z),该符号在函数 "private: double __cdecl ImgProc::TemplateMatchingOnGray(int)" (?TemplateMatchingOnGray@ImgProc@@AEAANH@Z) 中被引用
1>ImgProc.obj : error LNK2019: 无法解析的外部符号 "bool __cdecl cv::imwrite(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::debug_build_guard::_InputArray const &,class std::vector<int,class std::allocator<int> > const &)" (?imwrite@cv@@YA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_InputArray@debug_build_guard@1@AEBV?$vector@HV?$allocator@H@std@@@3@@Z),该符号在函数 "public: void __cdecl ImgProc::Binarize(struct EraseEnt * *,int)" (?Binarize@ImgProc@@QEAAXPEAPEAUEraseEnt@@H@Z) 中被引用
dllmain.obj : error LNK2001: 无法解析的外部符号 "bool __cdecl cv::imwrite(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::debug_build_guard::_InputArray const &,class std::vector<int,class std::allocator<int> > const &)" (?imwrite@cv@@YA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_InputArray@debug_build_guard@1@AEBV?$vector@HV?$allocator@H@std@@@3@@Z)
NeuralNetwork.obj : error LNK2001: 无法解析的外部符号 "bool __cdecl cv::imwrite(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::debug_build_guard::_InputArray const &,class std::vector<int,class std::allocator<int> > const &)" (?imwrite@cv@@YA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_InputArray@debug_build_guard@1@AEBV?$vector@HV?$allocator@H@std@@@3@@Z)
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::medianBlur(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,int)" (?medianBlur@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@H@Z),该符号在函数 "private: void __cdecl ImgProc::AdaptiveThreshold(class cv::Mat &,class cv::Mat &,double,int,double,int,int,int,class cv::Rect_<int>,enum adaptiveMethod)" (?AdaptiveThreshold@ImgProc@@AEAAXAEAVMat@cv@@0NHNHHHV?$Rect_@H@3@W4adaptiveMethod@@@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::GaussianBlur(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,class cv::Size_<int>,double,double,int)" (?GaussianBlur@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@V?$Size_@H@1@NNH@Z),该符号在函数 "private: void __cdecl ImgProc::AdaptiveThreshold(class cv::Mat &,class cv::Mat &,double,int,double,int,int,int,class cv::Rect_<int>,enum adaptiveMethod)" (?AdaptiveThreshold@ImgProc@@AEAAXAEAVMat@cv@@0NHNHHHV?$Rect_@H@3@W4adaptiveMethod@@@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::blur(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,class cv::Size_<int>,class cv::Point_<int>,int)" (?blur@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@V?$Size_@H@1@V?$Point_@H@1@H@Z),该符号在函数 "private: void __cdecl ImgProc::AdaptiveThreshold(class cv::Mat &,class cv::Mat &,double,int,double,int,int,int,class cv::Rect_<int>,enum adaptiveMethod)" (?AdaptiveThreshold@ImgProc@@AEAAXAEAVMat@cv@@0NHNHHHV?$Rect_@H@3@W4adaptiveMethod@@@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::Canny(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,double,double,int,bool)" (?Canny@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@NNH_N@Z),该符号在函数 "public: void __cdecl ImgProc::Binarize(struct EraseEnt * *,int)" (?Binarize@ImgProc@@QEAAXPEAPEAUEraseEnt@@H@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::dilate(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,class cv::debug_build_guard::_InputArray const &,class cv::Point_<int>,int,int,class cv::Scalar_<double> const &)" (?dilate@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@0V?$Point_@H@1@HHAEBV?$Scalar_@N@1@@Z),该符号在函数 "public: void __cdecl ImgProc::Binarize(struct EraseEnt * *,int)" (?Binarize@ImgProc@@QEAAXPEAPEAUEraseEnt@@H@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::warpAffine(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,class cv::debug_build_guard::_InputArray const &,class cv::Size_<int>,int,int,class cv::Scalar_<double> const &)" (?warpAffine@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@0V?$Size_@H@1@HHAEBV?$Scalar_@N@1@@Z),该符号在函数 "private: void __cdecl ImgProc::RotatoImage(class cv::Mat &,double)" (?RotatoImage@ImgProc@@AEAAXAEAVMat@cv@@N@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::cvtColor(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,int,int)" (?cvtColor@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@HH@Z),该符号在函数 "public: bool __cdecl ImgProc::LoadMat(unsigned char *,int,int,char *,struct EraseEnt * *,int)" (?LoadMat@ImgProc@@QEAA_NPEAEHHPEADPEAPEAUEraseEnt@@H@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::matchTemplate(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,int,class cv::debug_build_guard::_InputArray const &)" (?matchTemplate@cv@@YAXAEBV_InputArray@debug_build_guard@1@0AEBV_OutputArray@31@H0@Z),该符号在函数 "private: double __cdecl ImgProc::TemplateMatchingOnGray(int)" (?TemplateMatchingOnGray@ImgProc@@AEAANH@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::findContours(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,class cv::debug_build_guard::_OutputArray const &,int,int,class cv::Point_<int>)" (?findContours@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@1HHV?$Point_@H@1@@Z),该符号在函数 "private: int __cdecl ImgProc::ContourAnalysis(class cv::Mat &,class cv::Mat &)" (?ContourAnalysis@ImgProc@@AEAAHAEAVMat@cv@@0@Z) 中被引用
dllmain.obj : error LNK2001: 无法解析的外部符号 "void __cdecl cv::findContours(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,class cv::debug_build_guard::_OutputArray const &,int,int,class cv::Point_<int>)" (?findContours@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@1HHV?$Point_@H@1@@Z)
ImgProc.obj : error LNK2019: 无法解析的外部符号 "double __cdecl cv::arcLength(class cv::debug_build_guard::_InputArray const &,bool)" (?arcLength@cv@@YANAEBV_InputArray@debug_build_guard@1@_N@Z),该符号在函数 "private: int __cdecl ImgProc::ContourAnalysis(class cv::Mat &,class cv::Mat &)" (?ContourAnalysis@ImgProc@@AEAAHAEAVMat@cv@@0@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "class cv::Rect_<int> __cdecl cv::boundingRect(class cv::debug_build_guard::_InputArray const &)" (?boundingRect@cv@@YA?AV?$Rect_@H@1@AEBV_InputArray@debug_build_guard@1@@Z),该符号在函数 "private: int __cdecl ImgProc::ContourAnalysis(class cv::Mat &,class cv::Mat &)" (?ContourAnalysis@ImgProc@@AEAAHAEAVMat@cv@@0@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "double __cdecl cv::contourArea(class cv::debug_build_guard::_InputArray const &,bool)" (?contourArea@cv@@YANAEBV_InputArray@debug_build_guard@1@_N@Z),该符号在函数 "private: int __cdecl ImgProc::ContourAnalysis(class cv::Mat &,class cv::Mat &)" (?ContourAnalysis@ImgProc@@AEAAHAEAVMat@cv@@0@Z) 中被引用
dllmain.obj : error LNK2001: 无法解析的外部符号 "double __cdecl cv::contourArea(class cv::debug_build_guard::_InputArray const &,bool)" (?contourArea@cv@@YANAEBV_InputArray@debug_build_guard@1@_N@Z)
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::minEnclosingCircle(class cv::debug_build_guard::_InputArray const &,class cv::Point_<float> &,float &)" (?minEnclosingCircle@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEAV?$Point_@M@1@AEAM@Z),该符号在函数 "private: int __cdecl ImgProc::ContourAnalysis(class cv::Mat &,class cv::Mat &)" (?ContourAnalysis@ImgProc@@AEAAHAEAVMat@cv@@0@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::line(class cv::debug_build_guard::_InputOutputArray const &,class cv::Point_<int>,class cv::Point_<int>,class cv::Scalar_<double> const &,int,int,int)" (?line@cv@@YAXAEBV_InputOutputArray@debug_build_guard@1@V?$Point_@H@1@1AEBV?$Scalar_@N@1@HHH@Z),该符号在函数 "public: void __cdecl ImgProc::Binarize(struct EraseEnt * *,int)" (?Binarize@ImgProc@@QEAAXPEAPEAUEraseEnt@@H@Z) 中被引用
ImgProc.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::circle(class cv::debug_build_guard::_InputOutputArray const &,class cv::Point_<int>,int,class cv::Scalar_<double> const &,int,int,int)" (?circle@cv@@YAXAEBV_InputOutputArray@debug_build_guard@1@V?$Point_@H@1@HAEBV?$Scalar_@N@1@HHH@Z),该符号在函数 "public: void __cdecl ImgProc::DrawCircleSet(double (*)[2],int,unsigned char,unsigned char,unsigned char)" (?DrawCircleSet@ImgProc@@QEAAXPEAY01NHEEE@Z) 中被引用
dllmain.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::warpPolar(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,class cv::Size_<int>,class cv::Point_<float>,double,int)" (?warpPolar@cv@@YAXAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@V?$Size_@H@1@V?$Point_@M@1@NH@Z),该符号在函数 "void __cdecl harmonicmap2bar4binary(struct Block *,class cv::Mat &,class cv::Point_<float>,int)" (?harmonicmap2bar4binary@@YAXPEAUBlock@@AEAVMat@cv@@V?$Point_@M@3@H@Z) 中被引用
dllmain.obj : error LNK2019: 无法解析的外部符号 "double __cdecl cv::threshold(class cv::debug_build_guard::_InputArray const &,class cv::debug_build_guard::_OutputArray const &,double,double,int)" (?threshold@cv@@YANAEBV_InputArray@debug_build_guard@1@AEBV_OutputArray@31@NNH@Z),该符号在函数 "void __cdecl GetProjY4Break(int *,class cv::Mat &,int,int)" (?GetProjY4Break@@YAXPEAHAEAVMat@cv@@HH@Z) 中被引用
dllmain.obj : error LNK2019: 无法解析的外部符号 "class cv::RotatedRect __cdecl cv::minAreaRect(class cv::debug_build_guard::_InputArray const &)" (?minAreaRect@cv@@YA?AVRotatedRect@1@AEBV_InputArray@debug_build_guard@1@@Z),该符号在函数 "int __cdecl ContourAnalysis4MultiCarving(struct MeasureParam *,struct Block *,int,double,bool)" (?ContourAnalysis4MultiCarving@@YAHPEAUMeasureParam@@PEAUBlock@@HN_N@Z) 中被引用
NeuralNetwork.obj : error LNK2019: 无法解析的外部符号 "public: void __cdecl cv::dnn::dnn4_v20211004::Net::setInput(class cv::debug_build_guard::_InputArray const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,double,class cv::Scalar_<double> const &)" (?setInput@Net@dnn4_v20211004@dnn@cv@@QEAAXAEBV_InputArray@debug_build_guard@4@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@NAEBV?$Scalar_@N@4@@Z),该符号在函数 "public: void __cdecl NeuralNetwork::tf_inv_net_defect(class std::vector<double,class std::allocator<double> >,class std::vector<class cv::Mat,class std::allocator<class cv::Mat> > &)" (?tf_inv_net_defect@NeuralNetwork@@QEAAXV?$vector@NV?$allocator@N@std@@@std@@AEAV?$vector@VMat@cv@@V?$allocator@VMat@cv@@@std@@@3@@Z) 中被引用
NeuralNetwork.obj : error LNK2019: 无法解析的外部符号 "class cv::Mat __cdecl cv::dnn::dnn4_v20211004::blobFromImages(class cv::debug_build_guard::_InputArray const &,double,class cv::Size_<int>,class cv::Scalar_<double> const &,bool,bool,int)" (?blobFromImages@dnn4_v20211004@dnn@cv@@YA?AVMat@3@AEBV_InputArray@debug_build_guard@3@NV?$Size_@H@3@AEBV?$Scalar_@N@3@_N3H@Z),该符号在函数 "public: void __cdecl NeuralNetwork::tf_inv_net_defect(class std::vector<double,class std::allocator<double> >,class std::vector<class cv::Mat,class std::allocator<class cv::Mat> > &)" (?tf_inv_net_defect@NeuralNetwork@@QEAAXV?$vector@NV?$allocator@N@std@@@std@@AEAV?$vector@VMat@cv@@V?$allocator@VMat@cv@@@std@@@3@@Z) 中被引用
*********.dll : fatal error LNK1120: 24 个无法解析的外部命令
解决办法:
打开工程属性-->c/c++--->预处理器---->预处理器定义,添加宏定义:CV_IGNORE_DEBUG_BUILD_GUARD
问题三
直接调用Imgproc中的两个C++函数,在实现的过程中发现imread始终读取不了图像数据和cvLoadImage却可以,几经考证,发现的确是由于库关联的问题,在Debug模式下应该选择带'd'的lib,在Release模式下就选择不带'd'的lib,可以选择都加进去。
以上是关于vs2010使用main函数的主要内容,如果未能解决你的问题,请参考以下文章
vs2010中写c#,写了很多类,想在类里面添加main()做函数入口测试,但不能单独运行这个类
vs2010编写HDF5格式文件读取出错 “无法解析的外部符号 _H5Fclose,该符号在函数 _main 中被引用”