位于单个文件中的两个类的链接器错误(LNK2019)

Linker error (LNK2019) for two classes located in a single file

本文关键字:LNK2019 链接 错误 两个 于单个 文件      更新时间:2023-10-16

我有两个类位于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上找到其他提示,因为这里有很多关于链接器错误的问题,例如: