2012-05-31 42 views
1

在這裏,我與上次有一個類似的問題,我找不到任何答案。不可能編譯。頭文件。包含自己的對象定義

注意,我認爲重要的是:通常情況下我編譯我的程序在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` 

現在它不工作,它不識別分割器。我已經檢查過,如果分割器工作正常,並且一切正常,如果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` 

只能識別這個時間分段而不是同形。這可能有點難以理解,我試圖儘可能更好地解釋它。

任何幫助!?

非常感謝提前。

這裏是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實例將被創建並同步。 h不會被識別。

謝謝

+0

你如何創建object2?您省略了該調用。 – RedX

+0

「現在它不工作,它不識別object2。」 - 你會得到什麼錯誤信息? – wolfgang

+0

Object2的創建方式與對象1相同,如下所示:g ++ -c object2.cpp'pkg-config --cflags opencv''pkg-config --libs opencv' –

回答

1

您的包含標頭警衛是錯誤的。它們應該是唯一的,使用源文件的名稱,而不僅僅是_NAMES_H

所以在homogra.h你應該有這樣的:

#ifndef HOMOGRA_H 
#define HOMOGRA_H 
... 
#endif 

...在segmentator.h,你應該有這個

#ifndef SEGMENTATOR_H 
#define SEGMENTATOR_H 
... 
#endif 

此外,它really bad practiceusing namespace xxx;在一個頭文件。你很難讓你的標題與其他人共存。

正如Jonathan Wakely指出的那樣,帶下劃線的開頭符號也不是一個好主意。

+0

謝謝,我將閱讀有關命名空間的主題。謝謝。 –

+0

@Ivánovick它不是與命名空間有關,而是與預處理程序'#ifndef'和'#define'指令。查找「包括警衛」。 – juanchopanza

+0

它也是**真的**不好的做法(如禁止)使用以下劃線開頭且後跟大寫字母的名稱,只有實現(即編譯器和標準庫和操作系統)被允許使用這種名稱。只要給他們打電話改爲'HOMOGRA_H'和'SEGMENTATOR_H'。 –