2014-03-04 45 views
0

我目前正在嘗試製作一個程序,該程序使用openCV從網絡攝像頭拍攝圖片,並執行圖形操作以在openCV中找到一個區域,然後將其傳遞給一個.c程序,該程序通過端口將信息發送到服務器節目。是否可以將.c和.cpp(來自openCV)編譯並鏈接在一起?

我的問題是,即使我創建了一個h文件爲我在OpenCV中的.cpp代碼中使用,並在我的.C包括它的功能,還是有一個錯誤,說error: expected ‘)’ before ‘&’ token

這裏是我的simpleIS。 h:

int captureimg(); 
int backgroundsub(); 
void noisesuppression(Mat &ptr); 
void simplegetarea(Mat &img); 

extern int area1,area2,area3,area4; 

有什麼想法嗎?

+3

C中沒有引用。使用指針或值代替。 –

+2

另外不要忘記,已編譯的C/C++函數/變量解析爲不同的符號名稱。參見'extern「C」'獲得更多信息 – valdo

+0

它比其他方式更易於編譯c代碼作爲C++ – rerun

回答

0

您將不得不將自己需要的功能封裝到其他C++函數中,並使這些函數具有外部「C」連接。你也將不得不擁有C數據結構來保存創建C++類所需的東西。從C

調用包裝函數

例如,如果你有一段cpp的功能是這樣的:

int im_a_cxx_function(int , some_type, another_type &); 

你讓一個包裝函數:

extern "C" int im_a_cxx_wrapper_function(int i, 
              struct some_C_type *st_C, 
              struct another_C_type *at_C) 
{ 
    some_type st; 
    another_type at; 

    set_some_type(&st, st_C); 
    set_another_type(&at, at_C); 

    return im_a_cxx_function(i, st, at); 
} 

然後,在你的包裝頭功能:

#ifdef __cplusplus 
extern "C" { 
#endif 
int im_a_cxx_wrapper_function(int i, struct some_C_type *st_C, 
           struct another_C_type *at_C); 
#ifdef __cplusplus 
} 
#endif 

然後,在您的.c文件中包含封裝函數的標頭,然後調用包裝函數正常。主要原因在於,如果由於名稱變形而無法從C中調用一個沒有外部「C」的函數,並且由於您無法控制庫函數,因此必須將它們包裝起來。你也可以持有不透明的指向C++類型的指針,但由於你不能使用構造函數,所以你通常必須至少爲它們寫入工廠和刪除函數。

相關問題