位于单个文件中的两个类的链接器错误(LNK2019)
Linker error (LNK2019) for two classes located in a single file
我有两个类位于ExtractMaximalStableRegion.h
。它们是
class ExtractM_StableRegion
{
public:
//! the full constructor
ExtractM_StableRegion(int _delta = 5, int _min_area = 60, int _max_area = 14400,
double _max_variation = 0.25, double _min_diversity = .2,
int _max_evolution = 200, double _area_threshold = 1.01,
double _min_margin = 0.003, int _edge_blur_size = 5);
//! the operator that extracts the MSERs from the image or the specific part of it
void operator()(const Mat& image, CV_OUT vector<vector<Point> >& msers, const Mat& mask = Mat());
//AlgorithmInfo* info() const;
protected:
int delta;
int minArea;
int maxArea;
double maxVariation;
double minDiversity;
int maxEvolution;
double areaThreshold;
double minMargin;
int edgeBlurSize;
};
另一个是
class ExtractM_StableRegion_ParallelProcess{
private:
vector<pair<Mat, Mat>> objs;
vector<vector<Point>> msers;
public:
~ExtractM_StableRegion_ParallelProcess(){
if (!objs.empty())
{
objs.clear();
vector<pair<Mat, Mat>>().swap(objs);//check these Mat is released
}
if (!objs.empty())
{
msers.clear();
vector<vector<Point> >().swap(msers);
}
}
void operator()(const tbb::blocked_range<tbb::size_t>& r) {
for (tbb::size_t i = r.begin(); i != r.end(); ++i)
{
ExtractM_StableRegion()(objs[i].first, msers, objs[i].second);
}
}
ExtractM_StableRegion_ParallelProcess(vector<pair<Mat, Mat>> objs_) : objs(objs_){}
ExtractM_StableRegion_ParallelProcess(ExtractM_StableRegion_ParallelProcess& x, tbb::split) : objs(x.objs), msers(x.msers){}
void join(ExtractM_StableRegion_ParallelProcess& y)
{
for (vector<vector<Point> >::iterator it = y.msers.begin(); it != y.msers.end(); ++it)
msers.push_back(*it);
vector< vector<Point> > local;//check local is released
ExtractM_StableRegion()(objs[0].first, local, objs[0].second);
}
void compareWithSingleThread(){
for (int i = 0; i < objs.size(); ++i)
{
vector< vector<Point> > local;//check local is released
ExtractM_StableRegion()(objs[i].first, local, objs[i].second);
for (vector<vector<Point> >::iterator it = local.begin(); it != local.end(); ++it)
msers.push_back(*it);
}
return;
}
vector<vector<Point> > getMSER_Regions(){
return msers;
}
};
ExtractM_StableRegion_ParallelProcess
是为了加快ExtractM_StableRegion
类使用TBB。
然后我有另一个cpp文件counting.cpp
和运行ExtractM_StableRegion_ParallelProcess
类
ExtractM_StableRegion_ParallelProcess *ep = new ExtractM_StableRegion_ParallelProcess(objs);
//tbb::parallel_reduce(blocked_range<size_t>(0, numObj), *ep, auto_partitioner());//simple_partitioner()
ep->compareWithSingleThread();
当我构建时,我有链接错误,我不理解为
Counting.obj : error LNK2019: unresolved external symbol "public: __cdecl VIDEOANALYTICS_PLATFORM::ExtractM_StableRegion::ExtractM_StableRegion(int,int,int,double,double,int,double,double,int)" (??0ExtractM_StableRegion@VIDEOANALYTICS_PLATFORM@@QEAA@HHHNNHNNH@Z) referenced in function "public: void __cdecl VIDEOANALYTICS_PLATFORM::ExtractM_StableRegion_ParallelProcess::compareWithSingleThread(void)" (?compareWithSingleThread@ExtractM_StableRegion_ParallelProcess@VIDEOANALYTICS_PLATFORM@@QEAAXXZ)
1>Counting.obj : error LNK2019: unresolved external symbol "public: void __cdecl VIDEOANALYTICS_PLATFORM::ExtractM_StableRegion::operator()(class cv::Mat const &,class std::vector<class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > >,class std::allocator<class std::vector<class cv::Point_<int>,class std::allocator<class cv::Point_<int> > > > > &,class cv::Mat const &)" (??RExtractM_StableRegion@VIDEOANALYTICS_PLATFORM@@QEAAXAEBVMat@cv@@AEAV?$vector@V?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@V?$allocator@V?$vector@V?$Point_@H@cv@@V?$allocator@V?$Point_@H@cv@@@std@@@std@@@2@@std@@0@Z) referenced in function "public: void __cdecl VIDEOANALYTICS_PLATFORM::ExtractM_StableRegion_ParallelProcess::compareWithSingleThread(void)" (?compareWithSingleThread@ExtractM_StableRegion_ParallelProcess@VIDEOANALYTICS_PLATFORM@@QEAAXXZ)
方法void compareWithSingleThread()
使用ExtractM_StableRegion()(objs[i].first, local, objs[i].second);
时发生链接器错误
我也有对象ExtractM_StableRegion()(objs[i].first, local, objs[i].second);
在void operator()(const tbb::blocked_range<tbb::size_t>& r)
方法中使用。为什么compareWithSingleThread()
里面有错误,operator()
里面没有错误?由于
链接器错误意味着编译器已经终止,没有错误,但是链接器无法找到声明的定义(函数、方法或符号)。问题是,有时你不得不猜测这是从哪里来的。
在你的情况下,我会这样做:减少你的例子。注释掉所有(成员)变量和方法体,除了错误消息中提到的那些。在你上面的原始帖子中删除适当的行。这使得人们更容易理解哪里出了问题。它甚至可能引导你找到解决办法。
将方法主体从.cpp文件移动到.h文件。这可能会给你一个提示,告诉你哪里出了问题。或者重新构建。cpp文件。
检查相应的项目属性或makefile或其他。必须在某个地方指定什么被链接,其中和链接到什么和如何链接到。这可能是不完整的
你可以在Stackoverflow上找到其他提示,因为这里有很多关于链接器错误的问题,例如:
- 链接CPP文件进行测试时发生LNK2019错误
- MAPI 链接静态库 (LNK2019: 未解析的外部符号)
- C++ 带有出现LNK2019错误的对象的链接列表
- 已安装 MPI,但仍出现链接器错误LNK2019
- 标题文件中的更改破坏了链接器LNK2019
- C++中的LNK2019链接错误
- 在Visual Studio 2013终极项目中使用FFMPEG,链接错误LNK2019
- soci ODBC的C++链接器错误LNK2019
- 在C++解决方案中重用基类时,MSVC链接器错误LNK2019
- 链接器错误:错误LNK2019:未解析的外部符号
- MSVS 2012 快速 - 提升 - 链接器错误LNK2019
- 错误 LNK2019:未解析的外部符号链接器找不到 DLL
- C++链接器错误LNK2019
- 是什么导致我得到链接器错误LNK2019
- 模板函数链接器错误LNK2019
- QList作为函数参数-链接错误-LNK2019
- Visual Studio使用链接器LNK2019获取两个未解析的外部
- 包含LNK2019错误报头,但未链接
- 链接器错误"... .obj : error LNK2019: unresolved external symbol referenced in function"
- xDispatch LNK2019链接器错误