无法编译。 头files.Enclosed自己的对象定义(Not possible to com

2019-10-16 19:04发布

在这里,我有一个类似的问题作为最后的时间,和我找不到任何答案。

请注意,我认为重要的是:通常情况下我编译我的程序与下一个命令的OpenCV:

g++ -o def program.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

这条线将创建一个可执行文件的名字将是高清和我将能够使用。

我在一个项目中工作,并且因为它是挺大的,我不得不定义一些对象,只是为了使一切更容易,可能处理。 我创建了一个文件对象:homogra.cpp和homogra.h我用它的COMAND是:

g++ -c  homogra.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

然后,我在写program.cpp行的#include“homogra.h”

我喜欢编译:

 g++ -o def program.cpp homogra.o `pkg-config --cflags opencv` `pkg-config --libs opencv` 

到现在为止一切工作正常。

然后,我创建第二个对象(具有相同的编译行作为homogra,但这次segmentator.cpp和segmentator.h),我写了线的#include“segmentator.h”,(在program.cpp)和我编译喜欢:

g++ -o def program.cpp .o segmentator.o `pkg-config --cflags opencv` `pkg-config --libs opencv`

现在,它不工作,这是不承认segmentator。 我检查,如果已经被segmentator工作,如果homogra是唯一包含在program.cpp一切工作正常。

我注意到一些奇怪的事情。 如果我改变了线,我写之前,在行#include,#包括“segmentator.h”,然后#包括“homogra.h”,那么编译器,以编译在同一行:

 g++ -o def program.cpp homogra.o segmentator.o `pkg-config --cflags opencv` `pkg-config --libs opencv`

只有认识到这一点时segmentator而不是homogra。 这也许有点难以理解,我试图解释它尽可能好。

任何帮助!

提前谢谢了。

这里是homogra.h:

using namespace cv;
using namespace std;

#ifndef _NAMES_H  
#define _NAMES_H   
class homogra {
public:

    Mat matCalculation( Mat img, Mat img2);
    void printMatrix(Mat matrix);

};
#endif

在homogra.cpp我所有的tipical包括和homogra.h:

#include <stdio.h>
#include <stdlib.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <sstream>
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "homogra.h"

然后是功能解释。

对象2是segmentator.h

 using namespace cv;
 using namespace std;

#ifndef _NAMES_H  
#define _NAMES_H   
 class segmentator {
public:

    void search(Mat img,vector<std::vector<cv::Point> >& contours);

     void similar(vector<std::vector<cv::Point> >& contours,vector<std::vector<cv::Point> >& contours2,vector<int>& idx);

    vector<Mat> separate(Mat img,Mat img2,vector<std::vector<cv::Point> >&   contours,vector<std::vector<cv::Point> >& contours2,vector<int> idx);
};

#endif

而在segmentator.cpp我又都是一样的包括,除了homogra.h和,而不是这个我有segmentator.h。

Program.cpp是image_reg.cpp:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#include "homogra.h"
#include "segmentator.h" 
 using namespace cv;
 using namespace std;

int main(int argc, char ** argv )
{ //Here is the code where I try to invoque two instances of homogra and segmentator.
}

如果我让homogra.h作为第一个被读取的包括image_reg.cpp的名单,然后只homogra.h是公认的,如果我让在第一位置segmentator,那么只有segmentator.h将被创建和homogra实例。 ^ h将无法识别。

谢谢

Answer 1:

你包括头卫士是错误的。 他们应该是唯一的,使用源文件的名称,而不是仅仅_NAMES_H

所以在homogra.h你应该有这样的:

#ifndef HOMOGRA_H  
#define HOMOGRA_H   
...
#endif

...在segmentator.h,你应该有这个

#ifndef SEGMENTATOR_H  
#define SEGMENTATOR_H   
...
#endif

此外,这是非常糟糕的做法有一个using namespace xxx; 在头文件中。 你使它很难为你的头与他人共存。

乔纳森Wakely指出,用下划线开始的符号是不是一个好主意,无论是。



文章来源: Not possible to compile. Headers files.Enclosed own objects definition